Wczoraj natknąłem się na interesujący problem i mimo że poprawka była dość prosta, nadal jestem trochę nieostrożny w kwestii "dlaczego".Dlaczego obiekty członkowskie inicjowane są po konstruktorze superklasy?
Mam klasę, która ma prywatną zmienną składową, która jest przypisana, gdy jest tworzona, jednak jeśli jest używana w abstrakcyjnej funkcji, która jest wywoływana przez konstruktor superklasy, zmienna nie ma wartości. Rozwiązanie problemu było dość proste, po prostu musiałem zadeklarować zmienną jako static i została ona poprawnie przypisana. Niektóre kodu do zilustrowania problemu:
class Foo extends BaseClass
{
private final String bar = "fooBar!";
public Foo()
{
super();
}
@Override
public void initialize()
{
System.out.println(bar);
}
}
a klasa podstawowa:
abstract class BaseClass
{
public BaseClass()
{
initialize();
}
public abstract void initialize();
}
W tym przykładzie, kiedy nazywamy new Foo();
to będzie wyjście (null) zamiast oczekiwanego foobar!
Ponieważ powstaje obiekt typu Foo, czy jego członkowie nie powinni być przydzieleni i przydzieleni przed wywołaniem jego konstruktora (iw konsekwencji jego super klasy)? Czy jest to określone gdzieś w języku Java lub czy jest to specyficzne JVM?
Dzięki za wszelkie informacje!
Uważaj na metody wywoływania podklas od ctor klasy nadrzędnej. –
Kod faktycznie wyświetla fooBar! ponieważ zmienna 'bar' jest ostateczna, co czyni ją stałą kompilującą. Bez "final" wydrukowałoby zero. – x22
@ x22 To właściwie niepoprawne, a to, co doprowadziło do zbadania tej sytuacji - wierzyłem w to samo, kiedy ja to napisałem. –