Mam następujący kod. Chcę zdobyć obiekt klasy zewnętrznej, za pomocą którego utworzyłem obiekt klasy wewnętrznej inner
. Jak mogę to zrobić?
public class OuterClass {
public class InnerClass {
private String name = "Peakit";
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();
// How to get the same outer object which created the inner object back?
OuterClass anotherOuter = ?? ;
if(anotherOuter == outer) {
System.out.println("Was able to reach out to the outer object via inner !!");
} else {
System.out.println("No luck :-( ");
}
}
}
EDYCJA: Cóż, niektórzy z was zasugerowali zmodyfikowanie klasy wewnętrznej przez dodanie metody:
public OuterClass outer() {
return OuterClass.this;
}
Ale co jeśli nie mam kontroli, aby zmodyfikować klasę wewnętrzną, to (tylko w celu potwierdzenia) mamy inny sposób na uzyskanie odpowiedniego obiektu klasy zewnętrznej z obiektu klasy wewnętrznej?
źródło
OuterClass.this
odwołuje się do klasy zewnętrznej.źródło
Możesz (ale nie powinieneś) używać refleksji do zadania:
Oczywiście nazwa domyślnego odniesienia jest całkowicie niewiarygodna, więc jak powiedziałem, nie powinieneś :-)
źródło
Bardziej ogólna odpowiedź na to pytanie obejmuje zmienne zaciemnione i sposób ich dostępu.
W poniższym przykładzie (z Oracle) zmienna x w main () to shadowing Test.x :
Uruchomienie tego programu spowoduje wydrukowanie:
Więcej na: http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6
źródło
Oto przykład:
źródło
jeśli nie masz kontroli nad modyfikacją klasy wewnętrznej, analiza może ci pomóc (ale nie polecam). $ 0 to odwołanie w klasie wewnętrznej, które mówi, które wystąpienie klasy zewnętrznej zostało użyte do utworzenia bieżącego wystąpienia klasy wewnętrznej.
źródło
Oczywiście nazwa niejawnego odwołania jest niewiarygodna, dlatego nie należy używać refleksji dla zadania.
źródło
Zostały zredagowane w 2020-06-15
źródło