2013-04-16 15 views
6

Perché Java non fornisce il costruttore predefinito, se la classe ha un costruttore parametrizzato? consideri il seguente esempioPerché Java non fornisce il costruttore predefinito, se la classe ha un costruttore parametrizzato?

class A { 
    int a; 

    public A() { 
    } 

    public A(int val) { 
     a = val; 
    } 
} 

Qui ho bisogno di aggiungere in modo esplicito costruttore di default. C'è qualche ragione, perché Java non fornisce il costruttore predefinito per la classe che ha il costruttore parametrizzato?

+0

Non penso che sia un duplicato; sta chiedendo * perché * la specifica dice quello che fa. – OrangeDog

+0

@OrangeDog La difficoltà qui è che la risposta letterale alla domanda dell'OP è * "Un compilatore non genera un costruttore predefinito quando si definisce esplicitamente un costruttore perché la definizione di un costruttore predefinito è 'una che il compilatore definisce quando non si definisce un altro'"*. (Il loro public A() {} 'non è un costruttore predefinito.) L'OP stava probabilmente mescolando la terminologia e * probabilmente * in realtà chiedendo dei costruttori no-argument. Forse la domanda dovrebbe essere modificata se vogliamo ipotizzare che l'OP stia mescolando la terminologia. – Radiodef

risposta

2

Java fornirà un costruttore predefinito se la classe non ne definisce nessuno.

Se è stato definito qualsiasi costruttore, (anche uno senza argomenti) il compilatore non ne darà un altro.

Funziona così perché è stato specificato in questo modo. Puoi leggere ulteriori informazioni a riguardo nello Language Specification

+4

OP sa che 'Java non fornisce il costruttore predefinito, se la classe ha il costruttore parametrizzato'. La domanda è "perché"? – Pshemo

9

La ragione ha a che fare con una combinazione di sicurezza e interfaccia. Il compilatore non dovrebbe darti metodi che non definisci esplicitamente. L'unica eccezione è un comodo costruttore no-arg se non si specifica alcun costrutto. Se specifichi un costruttore, il compilatore presume che tu non voglia nessun altro.

5

Perché interromperà la progettazione della classe se il compilatore non fornisse automaticamente alcun costruttore di argomenti per ogni classe. Considera la classe Scanner. Ha pochi costruttori, in cui è possibile specificare da dove si desidera leggere i dati. Se il compilatore non aggiungesse alcun costruttore di arg, quindi, dopo aver richiamato uno dei metodi di Scanner per leggere i dati da un oggetto inizializzato con questo costruttore, verrebbe generata un'eccezione, poiché l'origine dati non verrebbe specificata.

2

Ci sono situazioni in cui sarebbe indesiderabile avere un costruttore predefinito. Il linguaggio deve fornire un modo per dire al compilatore di non generarlo. L'utilizzo di un indicatore diverso dalla presenza di un costruttore esplicito comporterebbe problemi come la necessità di specificare un costruttore ogni volta che l'impostazione predefinita è disabilitata.

L'attuale disposizione elimina tale problema garantendo che vi sia un altro costruttore ogni volta che il valore predefinito è disabilitato.

Problemi correlati