Một bình thường thiskhông bao giờ có thể có nulltrong mã Java thực 1 và ví dụ của bạn sử dụng một bình thường this. Xem các câu trả lời khác để biết thêm chi tiết.
Một người đủ điều kiện không bao giờ this nên có null, nhưng có thể phá vỡ điều này. Hãy xem xét những điều sau:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Khi chúng ta muốn tạo một instance của Inner, chúng ta cần thực hiện điều này:
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
}
Đầu ra là:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
cho thấy rằng nỗ lực của chúng tôi để tạo Innermột nulltham chiếu đến nó Outerđã thất bại.
Trên thực tế, nếu bạn dính vào bao thư "Pure Java", bạn không thể phá vỡ điều này.
Tuy nhiên, mỗi Innertrường hợp có một finaltrường tổng hợp ẩn (được gọi "this$0") chứa tham chiếu đến Outer. Nếu bạn thực sự khôn lanh, có thể sử dụng các phương tiện "không thuần túy" để gán nullcho lĩnh vực này.
- Bạn có thể sử dụng
Unsafeđể làm điều đó.
- Bạn có thể sử dụng mã gốc (ví dụ: JNI) để làm điều đó.
- Bạn có thể làm điều đó bằng cách sử dụng sự phản chiếu.
Dù bạn làm theo cách nào thì kết quả cuối cùng là Outer.thisbiểu thức sẽ đánh giá là null2 .
Trong ngắn hạn, nó là có thể cho một đủ điều kiện thisđể được null. Nhưng điều đó là không thể nếu chương trình của bạn tuân theo các quy tắc "Pure Java".
1 - Tôi giảm bớt các thủ thuật như "viết" các mã bytecodes bằng tay và chuyển chúng thành Java thực, điều chỉnh các mã bytecodes bằng BCEL hoặc tương tự, hoặc nhảy vào mã gốc và xử lý các thanh ghi đã lưu. IMO, đó KHÔNG phải là Java. Theo giả thuyết, những điều như vậy cũng có thể xảy ra do lỗi JVM ... nhưng tôi không nhớ mọi lần nhìn thấy báo cáo lỗi.
2 - Trên thực tế, JLS không cho biết hành vi sẽ như thế nào, và nó có thể phụ thuộc vào việc triển khai ... trong số những thứ khác.