2015-09-21 15 views
22

Uczę się java i przypadkowo natknąłem się na następujący kod, gdzie domyślny konstruktor jest wykonywany po metodzie.Java - Metoda wykonana przed domyślnym konstruktorem

 
public class ChkCons { 

    int var = getVal(); 

    ChkCons() { 
     System.out.println("I'm Default Constructor."); 
    } 

    public int getVal() { 
     System.out.println("I'm in Method."); 
     return 10; 
    } 

    public static void main(String[] args) { 

     ChkCons c = new ChkCons(); 

    } 

} 

WYJŚCIE:

 
I'm in Method. 
I'm Default Constructor. 

Czy ktoś proszę mi wyjaśnić, dlaczego tak się stało?

Dzięki.

+2

Pola są inicjalizowane przed wywołaniem konstruktora, ponieważ inicjalizujesz pole wywołując metodę 'getVal', jest ona wywoływana przed constreuctor – MadProgrammer

+0

W porządku, a następnie getVal() wykona przed STATYCZNYM BLOKEM? –

+0

Konstruktor? Nie, ale blok "statyczny" (z pamięci) zostanie wykonany raz przed polami – MadProgrammer

Odpowiedz

28

Wyrażenia inicjalizacji zmiennych instancji, takie jak int var = getVal();, są oceniane przed wykonaniem konstruktora. Dlatego przed wywołaniem konstruktora wywoływane jest getVal().

+0

Dobra, a następnie getVal() wykona to przed STATYCZNYM BLOKEM? –

+0

@RohitNigam Nie, statyczny blok inicjalizatora jest wykonywany po zainicjowaniu klasy. Ma to miejsce przed zainicjowaniem poszczególnych instancji klasy. – Eran

+1

@RohitNigam Jak to możliwe? Wymaga * instancji *. W statycznym bloku nie ma żadnej instancji. Pomyśl o tym przez chwilę. – Luaan

1

Dzieje się tak dlatego, że metoda jest inicjowana w polu przy użyciu int var = getVal();, więc zostanie wykonana przed wywołaniem konstruktora. Wybuch statyczny ma pierwszeństwo, jest wykonywany podczas ładowania klasy.

2

Możemy przekazać następujące dokumenty oracle na inicjowanie zmiennych instancji (podkreślenie moje) :

Inicjowanie Instance użytkowników

Zazwyczaj należy umieścić kod, aby zainicjować in zmienna stanowiska w konstruktorze . Istnieją dwie alternatywy do korzystania z konstruktora do inicjowania zmiennych instancji: bloki inicjalizatora i metody końcowe.

initializer bloki zmiennych instancji wyglądają jak statyczne initializer bloków, ale bez słowa kluczowego static:

{ // cokolwiek kod jest potrzebny do inicjowania goes here}

> THE Kompilator Java kopiuje bloki inicjalizacyjne do każdego konstruktora. W związku z tym to podejście może być używane do udostępniania bloku kodu między wieloma konstruktorami .

Końcowej metody nie można nadpisać w podklasie. Zostało to omówione w lekcji na temat interfejsów i dziedziczenia.Oto przykład z użyciu ostateczną metodę inicjowania instancję zmiennej:

class Whatever { 
private varType myVar = initializeInstanceVariable(); 

protected final varType initializeInstanceVariable() { 

    // initialization code goes here 
} 
} 

https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

2
public class InitializerIndex { 

    public InitializerIndex() { 
     // TODO Auto-generated constructor stub 
     System.out.println("Default Constructor"); 
    } 

    static { 

     System.out.println("Static Block one"); 
    } 

    { 
     System.out.println("Init one"); 
    } 

    void letsRoll() { 

    } 

    public static void main(String[] args) { 
     new InitializerIndex().letsRoll(); 
     new InitializerIndex().letsRoll(); 
    } 

    { 
     System.out.println("Init Two"); 
    } 

    static { 
     System.out.println("Static Block two"); 
    } 

} 

będą miały następujące dane wyjściowe:

Static Block one 
Static Block two 
Init one 
Init Two 
Default Constructor 
Init one 
Init Two 
Default Constructor 

Pierwszej całej zawartości statycznej jest ładowany, a następnie zawartość instancji. Zawartość statyczna jest ładowana tylko raz.

Nawet jeśli dwa obiekty są tworzone, statyczny blok nazywa się tylko wtedy, gdy pierwszy obiekt jest tworzony.

Ponadto, w momencie tworzenia obiektu lub w konstruktorów, jeśli chcesz używać tej metody jak

int var = getVal(); 

należy użyć metody statyczne.

5

Konstruktor wywoływany jest przed metodą. Wykonanie metody następuje po tym, co jest częścią tworzenia obiektu, w którym oceniane są zmienne instancji. Można to lepiej zrozumieć z następującego kodu.

class SuperClass{ 
    SuperClass(){ 
     System.out.println("Super constructor"); 
    } 
} 
public class ChkCons extends SuperClass{ 

    int var = getVal(); 

    ChkCons() { 
     System.out.println("I'm Default Constructor."); 
    } 

    public int getVal() { 
     System.out.println("I'm in Method."); 
     return 10; 
    } 

    public static void main(String[] args) { 

     ChkCons c = new ChkCons(); 

    } 

} 

Powyższy kod ma następujące wyjścia

Super constructor 
I'm in Method. 
I'm Default Constructor. 

Tutaj kompilator automatycznie dodaje super(); jako pierwsze pismo w ChkCons() konstruktora, a więc jest ona wywołana przed metodą getVal().