2012-06-16 11 views
5

Il testo nel libro che sto leggendo gli stati in sintesicostruttori overiding sezione del libro di testo non dare un senso

"Tecnicamente, i costruttori non possono essere overidden perché hanno stesso nome della classe corrente. I nuovi costruttori sono creati invece . di essere ereditato questo sistema funziona bene; ... "

La parte che non capisco è quando dicono questo:

" quando constuc della vostra classe vengono chiamati i metodi tor, vengono anche chiamati i metodi di costruzione con la stessa firma per tutte le superclassi. Pertanto, l'inizializzazione può avvenire per tutte le parti di una classe si eredita"

Quello che non capisco è la stessa sezione firma .... Viene attraversato a me come se tutti i costruttori devono avere la stessa firma , e poi quando si inizializza un oggetto classe figlio verranno chiamate automaticamente tutte le sue super classi invece di dover chiamare super (arg1, arg2) per ogni sottoclasse .... È questo ciò che stanno affermando?

+0

quale libro di testo? – UmNyobe

+0

Per ora mi sono attenuto al Sams Teach Yourself Java 2 in 21 Days. Troverà le nuove funzionalità di java in seguito. Ma è questo quello che stanno dicendo? –

+0

Bene, hai ragione di essere confuso, perché non è vero ... – UmNyobe

risposta

2

quando vengono chiamati i metodi del conduttore della classe, vengono chiamati anche i metodi di costruzione con la stessa firma per tutte le superclassi. Pertanto, l'inizializzazione può verificarsi per tutte le parti di una classe ereditate

Non è corretto. In primo luogo, una nota sulla terminologia: i costruttori non sono metodi, quindi il termine "metodi di costruzione" non ha alcun senso.

Mentre è vero che è stato richiamato un costruttore di super classe, non è necessario avere la stessa firma. Se un costruttore sottoclasse inizia con un super costruttore di classe invocazione espressioni quali

class Student extends Person { 
    public Student(String name) { 
     super(name, Occupation.STUDENT); 
    } 
} 

il costruttore della superclasse che corrisponde al numero di argomenti e tipi in invocato. Sei completamente libero di quali argomenti passi a quel costruttore.

Se il costruttore della sottoclasse non inizia con un'espressione di chiamata super costruttore, il compilatore inserirà una chiamata al costruttore di argomento zero accessibile della superclasse per voi - o genererà un errore di compilazione se non esiste tale costruttore.

Sams Teach Yourself Java 2 in 21 giorni, per ora

Siete consapevoli del fatto che Java 2 è un decennio fuori moda? Qualsiasi libro così vecchio ti insegnerà cose obsolete, che ti sarebbe meglio servire per dimenticare in fretta. Perché non usare un libro più moderno?

10

Questo non è Il costruttore della tua superclasse viene chiamato automaticamente solo se è il costruttore predefinito (ovvero il costruttore no-arg)

Se le tue superclas s non ha un costruttore predefinito, quindi è necessario richiamare esplicitamente un costruttore di propria scelta con super(args..).

Per esempio, questo è perfettamente bene nonostante il fatto che il costruttore BearManPig s' ha una firma diversa rispetto Animal:

public class Animal { 
    public Animal() { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    } 
} 

Ecco perché c'è un Java trovato costruttore no-arg il default.

Ora, quando non esiste un costruttore predefinito, è necessario essere espliciti su quale si desidera chiamare. Ad esempio, questo non lavoro:

// DOESN'T COMPILE 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    // There is no default constructor, stupid Java can't figure out what to do 
    public BearManPig(String string) { 
    } 
} 

ma questo:

// does compile 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    super(string); // I've told Java what to do 
    } 
} 
+0

Hmmm Grazie @Tim Pote, questo è quello che pensavo, ma ho letto questa sezione del testo e mi ha confuso. –

4

Tutte le classi di super non è necessario aver stessa firma costruttore.
Quando si crea un nuovo oggetto, Java non invocherà alcun costruttore di parametri di super classe se non è definito alcun costruttore. Nessun costruttore di parametri è fornito da Java se non si definisce nessun altro costruttore.
Se si definisce un altro costruttore, è necessario chiamarlo (sulla prima riga) all'interno del costruttore classe child.
This potrebbe aiutare.

Problemi correlati