Popatrzcie na źródła:
public class A {
public class B {
int fieldA;
int fieldB;
}
}
A teraz na:
public class C {
public static class D {
int fieldA;
int fieldB;
}
}
Co zmienia to, że klasa wewnętrzna D ma modyfikator static? :-)
Odpowiedź poniżej.
Wbrew pozorom dużo ;-)
Jeżeli klasa jest wewnętrzna, ale nie statyczna to może ona istnieć tylko jako część klasy "zewnętrznej".
Nie da się np. w statycznej metodzie main zrobić czegoś takiego:
B b = new B();
Bo jak to spróbujemy zrobić to kompilator nas opluje błędem mówiącym o braku instancji klasy A.
Dlatego jak z jakiegoś powodu chcecie mieć klasę wewnętrzną, ale móc ją instancjonować niezależnie od jej klasy zewnętrznej to musi być ona klasą statyczną.
A teraz o tym czemu to się czymś różni ;-)
W przypadku pierwszym, gdy mamy niestatatyczną klasę B, w klasie A jest dodawane przez kompilator dodatkowe pole finalne, o nazwie this$0 typu A (do której w momencie zawołania konstruktora zapisywana jest referencja this) dzięki któremu ewentualne metody z klasy B będą mogły dotykać wszystkich pól i metod klasy A.
Możemy więc napisać taki kod:
public class A {
public class B {
int getValue() {
return value;
}
}
private int value;
}
Gdzie metoda
getValue()
dotyka zmiennej value
z obiektu stworzonego z klasy A.Jak można się domyślić wszystkie anonimowe klasy wewnętrzne, albo takie klasy tworzone w metodach są niestetyczne, bo wszystkie mają dostęp i "łącze" do wszystkich członków klasy zewnętrznej.
Klasa D, to za to tylko "specjalny" przypadek zwykłej klasy. Możemy sobie ją instancjonować z dowolnego miejsca w którym ją widzimy.
Można też zgadywać, że jest to jakaś klasa pomocnicza i jej twórca uznał, że nie ma sensu jej wyrzucać do osobnego pliku, ale że jest ona osobnym bytem, który do istnienia nie potrzebuje klasy zewnętrznej.
Podobne postybeta
O wyższości klas anonimowych
Paradoks Java'y - domyślny poziom widoczności jest stosowany najrzadziej ;-)
Statyczna analiza kodu, czy to ma sens?
Javozagadka ;-)
Sztuczki tropiciela błędów, part 3 - hackujemy klasy finalne ;-)
Brak komentarzy:
Prześlij komentarz