2014-12-28 12 views
5

Jeśli mam coś takiego:Kiedy wywoływany jest Java Implicit Constructor w porównaniu do konstruktora klasy podstawowej?

public class SuperClass 
{ 
    SuperClass() 
    { 
     x = true; 
    } 
    public boolean x; 
} 

public class SubClass extends SuperClass 
{ 
    SubClass() 
    { 
     x = false; 
    } 
} 

i ostatecznie dokonać SubClass obiekt. Czy x będzie prawdziwe czy fałszywe? Od http://docs.oracle.com/javase/specs/jls/se5.0/html/execution.html#12.5 wygląda na to, że będzie to fałsz.

+0

W twoim przykładzie nie ma połączenia między bazą a superklasami. – Maroun

+0

'SuperClass' i' BaseClass' są niezależne w twoim przykładzie. – August

+5

Twoje nazwy klas są mylące, czy 'BaseClass' nie powinno rozszerzać' SuperClass'? Również w takim przypadku jego nazwa nie powinna być bardziej podobna do 'SubClass' lub' DerivedClass'? – Pshemo

Odpowiedz

10

Z Section 12.5 of the Java Language Specification (odpowiednia część pogrubioną czcionką)

Przed odniesienie do nowo utworzonego obiekt jest zwracany jako wynik wskazaną konstruktor jest przetwarzany w celu zainicjowania nowego obiektu, stosując następującą procedurę:

  1. Przypisywanie argumentów konstruktora do nowo utworzonych zmiennych parametrów dla tego wywołania konstruktora.

  2. Jeśli ten konstruktor rozpoczyna się od jawnego wywołania konstruktora (§8.8.7.1) innego konstruktora w tej samej klasie (przy użyciu tego), następnie przeanalizuj argumenty i przetwórz wywołanie konstruktora rekursywnie, używając tych samych pięciu kroków. Jeśli to wywołanie konstruktora zakończy się nagle, to ta procedura kończy się nagle z tego samego powodu; w przeciwnym razie kontynuuj od kroku 5.

  3. Ten konstruktor nie rozpoczyna się od jawnego wywołania konstruktora innego konstruktora w tej samej klasie (używając tego). Jeśli ten konstruktor jest dla klasy innej niż Object, wówczas ten konstruktor rozpocznie się od jawnego lub niejawnego wywołania konstruktora superklasy (używając super). Oceń argumenty i przetwórz rekursywnie wywołanie konstruktora nadklasy za pomocą tych samych pięciu kroków. Jeśli to wywołanie konstruktora zakończy się nagle, to ta procedura kończy się nagle z tego samego powodu. W przeciwnym razie kontynuuj od kroku 4.

  4. Wykonaj inicjalizatory instancji i inicjatory zmiennych instancji dla tej klasy, przydzielając wartości inicjalizatorów zmiennych instancji do odpowiednich zmiennych instancji, w kolejności od lewej do prawej, w której pojawiają się one tekstowo. w kodzie źródłowym dla klasy. Jeśli wykonanie któregokolwiek z tych inicjalizatorów spowoduje wyjątek, nie są przetwarzane żadne kolejne inicjalizatory i ta procedura kończy się nagle z tym samym wyjątkiem. W przeciwnym razie kontynuuj od kroku 5.

  5. Wykonaj pozostałą część korpusu tego konstruktora. Jeśli wykonanie to zakończy się nagle, to ta procedura kończy się nagle z tego samego powodu. W przeciwnym razie procedura ta kończy się normalnie.

Więc konstruktora klasy nadrzędnej będzie wywoływana pierwszy (krok 3), ustawienie x true. Po przetworzeniu konstruktora nadklasy i zakończeniu tego samego kroku rekursywnie, ciało konstruktora klasy potomnej ustawi ją na false (krok 5).

7

W oryginalnej wersji kodu [*] dwie klasy są niepowiązane, a BaseClass nie będzie nawet kompilować, ponieważ nie jest zadeklarowana ani odziedziczona x.

Jeśli wykonane BaseClass podklasą SuperClass, x będzie false, ponieważ SuperClass "konstruktor s potrwa zanim BaseClass wieku.

[*] Zanim ktoś edytował pytanie, aby dodać extend SuperClass.

Powiązane problemy