java私有instance_java – Instance Initializer与私有成员
這條線
b = new Test5(){{ value = 1 ;}};
創建一個擴展Test5的匿名類的實例.但是,由于值是私有的,因此匿名類無法訪問其超類的實例變量.
由于Test5的匿名子類沒有可見的變量值,編譯器會在下一個范圍內查找替代方法.在這種情況下,下一個范圍屬于靜態main方法.編譯器發現Test5的實例變量,并發出警告,因為無法從靜態上下文引用實例變量.
你有兩個選擇:
>使實例變量可供匿名類訪問:
受保護的int值;
>或使靜態main方法可以訪問變量:
private static int value;
我從你的問題中得出結論,第一個選擇是你真正想做的事情.
@Tom:問題不在于首先搜索靜態范圍.如果是這種情況,則替代(1)將不起作用,因為仍然首先找到實例變量值,但仍然無法引用.
@Ken:你的instanceMethod()不能做,你期望它做什么!看看下面的代碼:
class Test5A {
private int value;
public void instanceMethod() {
Test5A a = new Test5A() {{ value = 1; }}; // (A)
System.out.println(this.value);
System.out.println(a.value);
}
public static void main(String[] args) {
new Test5A().instanceMethod();
}
}
此示例代碼模仿您的類的行為.如果編譯并執行它,您將看到輸出為“1 0”.
雖然(A)中的匿名子類的實例初始化程序看起來像是將一個賦值給它自己的值實例變量,但該變量實際上只能在匿名類的超類中可見.相反,在第(A)行,唯一一個名為value的可見變量是Test5A實例的實例變量,在該實例上調用instanceMethod().因此,它變為一個.
現在讓我們提高價值的可見度:
class Test5B {
protected int value;
public void instanceMethod() {
Test5B a = new Test5B() {{ value = 1; }};
System.out.println(this.value);
System.out.println(a.value);
}
public static void main(String[] args) {
new Test5B().instanceMethod();
}
}
這次輸出為“0 1”.實例變量值由匿名子類繼承,并且對于其實例初始化程序是可見的.因此,將一個分配給正確的實例變量.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java私有instance_java – Instance Initializer与私有成员的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: days matter怎么换背景图(Ma
- 下一篇: java xwork_java-与休眠的