Jest to bezpośrednio z http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Polecenie wykonania
Spójrz na następującą klasę, czy wiesz, która zostanie najpierw wykonana?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Wynik:
wywoływano inicjator statyczny
wywoływano inicjator instancji
o nazwie konstruktor
wywoływano inicjator instancji
o nazwie konstruktor
2. Jak działa inicjalizator instancji Java?
Inicjator instancji powyżej zawiera instrukcję println. Aby zrozumieć, jak to działa, możemy potraktować to jako zmienną instrukcję przypisania, np b = 0
. Może to uczynić bardziej oczywistym zrozumienie.
Zamiast
int b = 0
, mógłbyś pisać
int b;
b = 0;
Dlatego inicjalizatory instancji i inicjatory zmiennych instancji są prawie takie same.
3. Kiedy inicjalizatory instancji są przydatne?
Stosowanie inicjatorów instancji jest rzadkie, ale nadal może być przydatną alternatywą dla inicjatorów zmiennych instancji, jeśli:
- Kod inicjujący musi obsługiwać wyjątki
- Wykonuj obliczenia, których nie można wyrazić za pomocą inicjatora zmiennej instancji.
Oczywiście taki kod mógłby zostać napisany w konstruktorach. Ale jeśli klasa ma wiele konstruktorów, musisz powtórzyć kod w każdym konstruktorze.
Za pomocą inicjatora instancji możesz po prostu napisać kod raz i zostanie on wykonany bez względu na to, jakiego konstruktora użyto do utworzenia obiektu. (Myślę, że to tylko koncepcja i nie jest często używana).
Innym przypadkiem, w którym użyteczne są inicjalizatory instancji, są anonimowe klasy wewnętrzne, które w ogóle nie mogą zadeklarować żadnych konstruktorów. (Czy będzie to dobre miejsce do umieszczenia funkcji logowania?)
Dzięki Derhein.
Zauważ też, że klasy Anonimowe implementujące interfejsy [1] nie mają konstruktorów. Dlatego inicjatory instancji są potrzebne do wykonania dowolnego rodzaju wyrażeń w czasie budowy.
public static void staticMethod(){}
, jeśli wykonaszTestStatic.class.getMethod("staticMethod");
. Inicjator statyczny nie zostanie wywołany. Więcej informacji tutaj docs.oracle.com/javase/specs/jvms/se10/html/…