Aby wyjaśnić nieporozumienia ze statycznym - Ja po prostu odwołać się do tego małego kawałka kodu:
public class Foo {
{ System.out.println("Instance Block 1"); }
static { System.out.println("Static Block 1"); }
public static final Foo FOO = new Foo();
{ System.out.println("Instance Block 2"); }
static { System.out.println("Static Block 2 (Weird!!)"); }
public Foo() { System.out.println("Constructor"); }
static public void main(String p[]) {
System.out.println("In Main");
new Foo();
}
}
Niespodzianka jest, że wyjście jest następująca:
Static Block 1
Instance Block 1
Instance Block 2
Constructor
Static Block 2 (Weird!!)
In Main
Instance Block 1
Instance Block 2
Constructor
Zauważ, że mamy static {}
, która nazywa się po dwie instancji {}
. dzieje się tak dlatego, że po raz pierwszy konstruktor jest wywoływany w środku, wrzucając kolejność wykonywania.
Odkryłem to podczas pracy nad tą odpowiedzią - https://stackoverflow.com/a/30837385/744133.
Zasadniczo możemy obserwować tak się stało:
czasie po raz pierwszy obiekt jest zainicjowany, Inicjalizuj bieżący obiekt zarówno statyczne i instancji inicjalizacji przemieszane na podstawie kolejności występowania
Dla wszystkich przy kolejnych inicjalizacjach, inicjowanie instancji odbywa się tylko w kolejności występowania, ponieważ inicjalizacja statyczna już się zdarzyła.
Muszę zbadać, w jaki sposób połączenie dziedziczenia, zarówno jawne, jak i niejawne, połączenia do super i to wpłynie na to i zaktualizuje wyniki. Prawdopodobnie byłby podobny do innych dostarczonych odpowiedzi, z wyjątkiem tego, że pomylili się ze statyczną inicjalizacją.
Świetne wyjaśnienie @Arun P Johhny +1 dla Ciebie. –
* Inicjalizacja * zmiennej instancji jest przenoszona wewnątrz konstruktora. – EJP
Przynajmniej nie kolejna błędna interpretacja specyfikacji. Jest niekompletny, ale pomaga wyjaśnić, co się dzieje. – YoYo