poniedziałek, stycznia 31, 2011

Klasa statyczna - ki diabeł?;-)

Zagadka dla Java'owców. Prosta chyba :-)

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
Hackowanie dysku ;-)
Javozagadka ;-)
Sztuczki tropiciela błędów, part 3 - hackujemy klasy finalne ;-)
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)