Bir normal thisasla nullgerçek Java kodu 1'de olamaz ve örneğiniz bir normal this. Daha fazla ayrıntı için diğer cevaplara bakın.
Bir nitelikli this gerektiğini asla null, ama bu kırmak mümkündür. Aşağıdakileri göz önünde bulundur:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Bir örnek oluşturmak istediğimizde Inner, bunu yapmamız gerekir:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
Çıktı:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
çabamız bir oluşturmak için olduğunu gösteren Innerbir ile nullonun referans Outerbaşarısız oldu.
Aslında, "Saf Java" zarfının içinde kalırsanız, bunu kıramazsınız.
Bununla birlikte, her bir Innerörnek, bir gizli sahiptir final(denilen sentetik alan "this$0"referans içerir) Outer. Eğer gerçekten zor iseniz null, alana atamak için "saf olmayan" araçlarını kullanmak mümkündür .
- Bunu
Unsafeyapmak için kullanabilirsin .
- Bunu yapmak için yerel kodu (örneğin JNI) kullanabilirsiniz.
- Bunu yansıma kullanarak yapabilirsiniz.
Her iki şekilde de yaparsanız, sonuç, Outer.thisifadenin null2 olarak değerlendirilmesidir .
Kısacası nitelikli olmak mümkündür . Ancak programınızın "Saf Java" kurallarına uyması imkansızdır .thisnull
1 - Bayt kodlarını elle "yazmak" ve bunları gerçek Java olarak aktarmak, BCEL veya benzerini kullanarak bayt kodlarını değiştirmek veya yerel koda atlamak ve kaydedilen kayıtlarla uğraşmak gibi hilelere önem vermem. IMO, bu Java DEĞİLDİR. Varsayımsal olarak, bu tür şeyler bir JVM hatasının bir sonucu olarak da olabilir ... ama gördüğüm her hata raporunu hatırlamıyorum.
2 - Aslında, JLS davranışın ne olacağını söylemiyor ve diğer şeylerin yanı sıra uygulamaya bağlı olabilir.