2014-04-01 17 views
6

So che la formulazione è un po 'confusa e strana, ma abbiate pazienza con me, non ho idea di come si possa esprimere una frase più breve.In Java, è possibile chiamare il costruttore della superclasse di una classe genitore tramite il costruttore della classe figlio della classe genitore?

Diciamo che avete una classe chiamata SuperBlah, e si ereditato in una classe denominata Blah allora avete ereditato Blah in una classe chiamata ChildBlah (So SuperBlah-Blah-ChildBlah). La parola chiave super(); utilizzata nel costruttore ChildBlah è chiamata costruttore di SuperBlah se Blah non ha un costruttore?

Per quelli di voi che hanno detto no, allora perché funziona? Abbiamo una classe chiamata BlusterBug che estende la classe Critter e chiama il super nel costruttore di BlusterBug. Critter non ha un costruttore, ma la classe che Critter estende ha un costruttore. (I volutamente omesso il resto del codice sulle classi)

public class BlusterCritter extends Critter { 
    // instance vaiables 
    private int courageFactor; 
    private static final double DARKENING_FACTOR = 0.05; 
    // create a constructor(include what is necesary for parent) 
    public BlusterCritter(int c) 
    { 
     super(); 
     courageFactor = c; 
    } 

Poi nella classe Critter, non ha alcun costruttore!

public class Critter extends Actor// omitted all the code 
{ 
    /** 
    * A critter acts by getting a list of other actors, processing that list, 
    * getting locations to move to, selecting one of them, and moving to the 
    * selected location. 
    */ 
    public void act() 
    { 
     if (getGrid() == null) 
      return; 
     ArrayList<Actor> actors = getActors(); 
     processActors(actors); 
     ArrayList<Location> moveLocs = getMoveLocations(); 
     Location loc = selectMoveLocation(moveLocs); 
     makeMove(loc); 
    } 

Ma poi la classe attore ha un costruttore!

public class Actor 
{ 
    private Grid<Actor> grid; 
    private Location location; 
    private int direction; 
    private Color color; 

    /** 
    * Constructs a blue actor that is facing north. 
    */ 
    public Actor() 
    { 
     color = Color.BLUE; 
     direction = Location.NORTH; 
     grid = null; 
     location = null; 
    } 

E la parte più strana? Il programma funziona perfettamente e il compilatore non rileva errori! Come sta succedendo?

+4

Questo tipo di domanda è davvero la risposta migliore solo scrivendo le classi con le dichiarazioni di stampa e test. Penso che potresti ottenere la tua risposta in meno di 30 righe di codice e potresti imparare molti dettagli. – merlin2011

+0

** Ogni ** classe Java ha almeno un costruttore. Se non dichiara un costruttore, ha un costruttore predefinito che non accetta parametri e contiene solo una chiamata 'super();'. –

risposta

3

Se Blah non ha alcun costruttore, il compilatore genererà un implicito costruttore senza argomenti per Blah che è proprio super() --that è, chiamerà il costruttore SuperBlah s'.

Così, quando ChildBlah 'costruttore s chiama super(), chiamerà questo costruttore implicita che il compilatore generato per Blah, che si traduce in SuperBlah' costruttore s chiamato. Quindi, in un certo senso, penso che la risposta alla tua domanda sia "sì".

Ma questo funziona solo se Blah non ha costruttori. (E nel tuo codice attuale, Critter non ha costruttori, quindi funziona.) Se sono definiti altri costruttori per Blah, ma non esiste un costruttore senza argomenti accessibile, non ci sarà un costruttore implicito senza argomenti e il risultato sarà un errore in fase di compilazione.

+0

Questa è una funzionalità davvero fantastica che Java ha allora. – user3421796

2

No, non lo farà. Chiamerà il costruttore implicito predefinito in Blah.
Se Blah definisce altri costruttori (con parametri) ma non ha
costruttore predefinito, questo genererà un errore di compilazione.

Si noti inoltre che i costruttori non sono ereditate
(se questo si riferisce in alcun modo alla tua domanda/pensieri).

0

Chiamerà il costruttore di Blah, generando un errore del compilatore se Blah non ne ha uno.

1

Sì, lo farà. Se Blah non ha alcun costruttore, chiamerà costruttore predefinito vuoto e transitivamente chiamerà costruttore non parametrico SuperBlah.

0

No. I costruttori non sono come i metodi nel rispetto dell'impostazione facoltativa di una classe intermedia nella gerarchia. Se un metodo di istanza della super classe non è implementato nella classe intermedia, chiamando il metodo dalla sottoclasse tramite super.method() si invocherà il metodo della superclasse. Ma un costruttore per ogni classe nella gerarchia deve essere chiamato - non puoi saltare i costruttori della classe intermedia.

Problemi correlati