Mam następujący fragment kodu:
public class MyClass {
class Inner {
int s, e, p;
}
public static void main(String args[]) {
Inner in;
}
}
Do tej części kod jest w porządku, ale nie jestem w stanie utworzyć wystąpienia „in” w głównej metodzie, tak in = new Inner()
jak jest to pokazane non static field cannot be referenced in static context
.
W jaki sposób mogę to zrobić? Nie chcę, aby moja Inner
klasa była statyczna .
java
static
inner-classes
Victor Mukherjee
źródło
źródło
Odpowiedzi:
Musisz mieć również odniesienie do innej klasy zewnętrznej.
Gdyby Inner był statyczny, byłby
źródło
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass()
. Klasy zagnieżdżone„Zwykła” klasa wewnętrzna ma ukryty (niejawny) wskaźnik do instancji klasy Outer. Pozwala to kompilatorowi na wygenerowanie kodu do śledzenia wskaźnika bez konieczności wpisywania go. Na przykład, jeśli w klasie zewnętrznej znajduje się zmienna „a”, wówczas kod w klasie wewnętrznej może po prostu wykonać „a = 0”, ale kompilator wygeneruje kod dla „externalPointer.a = 0”, utrzymując ukryty wskaźnik pod osłony.
Oznacza to, że kiedy tworzysz instancję klasy wewnętrznej, musisz mieć instancję klasy zewnętrznej, z którą możesz ją połączyć. Jeśli zrobisz to wewnątrz metody klasy zewnętrznej, wówczas kompilator będzie wiedział, że używa "this" jako niejawnego wskaźnika. Jeśli chcesz utworzyć link do innej zewnętrznej instancji, użyj specjalnej „nowej” składni (zobacz fragment kodu poniżej).
Jeśli sprawisz, że Twoja klasa wewnętrzna stanie się „statyczna”, wtedy nie będzie ukrytego wskaźnika, a Twoja klasa wewnętrzna nie będzie mogła odwoływać się do członków klasy zewnętrznej. Statyczna klasa wewnętrzna jest identyczna z klasą zwykłą, ale jej nazwa jest objęta zakresem wewnątrz elementu nadrzędnego.
Oto fragment kodu, który demonstruje składnię tworzenia statycznych i niestatycznych klas wewnętrznych:
źródło
Jeśli chcesz stworzyć
new Inner()
z metody, zrób to z metody instancji klasyMyClass
:źródło
Odpowiedź Aleksieja Kaigorodowa to właściwa odpowiedź. Jego rozwiązanie pozwala na tworzenie instancji klas wewnętrznych z poziomu metody statycznej, takiej jak main () tej samej klasy. W przeciwnym razie nie można utworzyć wystąpienia klasy wewnętrznej w ramach metody statycznej. Nie kompiluje się. Rozwiązanie Alexei'a nie kompiluje się i pozwala na tworzenie instancji klas wewnętrznych z metody statycznej. Pozostałe odpowiedzi są interesującymi uwagami dodatkowymi, ale nie uważam, aby odpowiadały one faktycznemu pytaniu.
źródło