Bir normal this
asla null
gerç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 Inner
bir ile null
onun referans Outer
baş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
Unsafe
yapmak 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.this
ifadenin null
2 olarak değerlendirilmesidir .
Kısacası nitelikli olmak mümkündür . Ancak programınızın "Saf Java" kurallarına uyması imkansızdır .this
null
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.