2017-08-16 20 views
8

Proszę spojrzeć na ten kod:Java - rozciąga dlaczego super zmienna a jest 0

class Sup { 
    int a = 8; 

    public void printA() { 
     System.out.println(a); 
    } 

    Sup() { 
     printA(); 
    } 
} 

public class Sub extends Sup { 
    int a = 9; 

    @Override 
    public void printA() { 
     System.out.println(a); 
    } 

    Sub() { 
     printA(); 
    } 

    public static void main(String[] args) { 
     Sub sub = new Sub(); 
    } 
} 

wynik: konsola druku: 0 9
wiem, że podklasa najpierw wywołuje nadklasą constructor
ale dlaczego to jest 0 9, a nie 8 9?

+0

Czy jesteś pewien, że konstruktor jest wywoływany w kolejności, którą uważasz za? –

+4

@ cricket_007: Oczywiście, że tak. Nie możesz ** unikać wywoływania go w Javie. –

+0

@ T.J.Crowder Możesz tego uniknąć, używając serializacji lub klonowania. – Flown

Odpowiedz

14

Kiedy wywołuje konstruktor SupprintA() to wykonuje metodę printA klasy Sub (które zastępuje metodę o tej samej nazwie klasy Sup), więc zwraca wartość a zmiennej klasy Sub, która nadal jest 0, ponieważ zmienne instancji Sub nie zostały jeszcze zainicjowane (są inicjowane dopiero po wykonaniu konstruktora Sup).

+2

To także dlatego niektóre standardy kodowania wymagają, aby wszystkie metody wywoływane w konstruktorze były "ostateczne" lub "prywatne". Aby zapobiec nadpisaniom powodującym takie sytuacje. – Kiskae