2014-04-01 19 views
6

Wiem, że sformułowanie jest trochę zagmatwane i dziwne, ale proszę o mnie, nie mam pojęcia, jak sformułować to krótko.W języku Java, czy można wywołać konstruktor nadklasy klasy macierzystej przez konstruktor klasy potomnej klasy nadrzędnej?

Powiedzmy, że masz klasę o nazwie SuperBlah, i odziedziczył go w klasie o nazwie Blah potem odziedziczył Blah do klasy o nazwie ChildBlah (So SuperBlah-Blah-ChildBlah). Czy słowo kluczowe super(); użyte w konstruktorze ChildBlah nazywa się konstruktorem SuperBlah, jeśli Blah nie ma konstruktora?

Do tych z was, którzy powiedzieli "nie", dlaczego to działa? Mamy klasę o nazwie BlusterBug, która rozszerza klasę Critter i wywołuje super w konstruktorze BlusterBug. Critter nie ma konstruktora, ale klasa, którą rozwija Critter, ma konstruktora. (I celowo pominięto resztę kodu na zajęciach)

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; 
    } 

Następnie w klasie Critter, że nie ma żadnych konstruktorów!

Ale wtedy klasa Aktor ma konstruktora!

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; 
    } 

A najdziwniejsza część? Program działa doskonale, a kompilator nie łapie żadnych błędów! Jak to się dzieje?

+4

Tego rodzaju pytanie najlepiej odpowiedzieć, pisząc klasy z instrukcjami drukowania i testowaniem. Myślę, że możesz uzyskać odpowiedź w mniej niż 30 liniach kodu i możesz nauczyć się wielu szczegółów. – merlin2011

+0

** Każda ** klasa Java ma co najmniej jeden konstruktor. Jeśli nie deklaruje konstruktora, ma domyślny konstruktor, który nie przyjmuje parametrów i zawiera tylko wywołanie 'super();'. –

Odpowiedz

3

Jeśli Blah nie posiada dowolny konstruktor, kompilator wygeneruje niejawny konstruktor no-argument za Blah to tylko super() czyli regulują to będzie ona wywołać konstruktor SuperBlah „s.

Więc kiedy ChildBlah „wywołuje konstruktor s super(), to nazywamy to niejawny konstruktor, że kompilator wygenerowany dla Blah, co powoduje SuperBlah” konstruktor s miano. W pewnym sensie myślę, że odpowiedź na twoje pytanie brzmi "tak".

Ale działa to tylko wtedy, gdy Blah nie ma konstruktorów. (W twoim aktualnym kodzie, Critter nie ma żadnych konstruktorów, więc działa). Jeśli zdefiniowano inne konstruktory dla Blah, ale nie ma dostępnego konstruktora bezargumentowego, wtedy nie będzie niejawnego konstruktora bez argumentów , a wynikiem będzie błąd podczas kompilacji.

+0

To jest naprawdę fajna funkcja, którą ma wtedy Java. – user3421796

2

Nie, nie będzie. Wywołuje domyślny domyślny konstruktor w Blah.
Jeśli Blah definiuje innych konstruktorów (z parametrami), ale nie ma domyślnego konstruktora, spowoduje to błąd kompilacji.

Należy również zauważyć, że konstruktorzy nie są dziedziczeni
(jeśli odnosi się to w jakikolwiek sposób do twojego pytania/myśli).

0

Zadzwoni do konstruktora Blah, rzucając błąd kompilatora, jeśli Blah go nie ma.

1

Tak, będzie. Jeśli Blah nie ma żadnego konstruktora, wywoła domyślny pusty konstruktor i przejściowo wywoła nieparametryczny konstruktor SuperBlah.

0

Nie. Konstruktory nie są podobne do metod pod względem nadpisywania opcjonalnego przez klasę pośrednią w hierarchii. Jeśli metoda klasy super klasa nie jest zaimplementowana w klasie pośredniej, wywołanie metody z podklasy przez super.method() wywoła metodę nadklasy. Ale musi zostać wywołany konstruktor dla każdej klasy w hierarchii - nie można pominąć konstruktorów klasy pośredniej.

Powiązane problemy