java私有instance_java – Instance Initializer与私有成员
這條線
b = new Test5(){{ value = 1 ;}};
創(chuàng)建一個(gè)擴(kuò)展Test5的匿名類(lèi)的實(shí)例.但是,由于值是私有的,因此匿名類(lèi)無(wú)法訪問(wèn)其超類(lèi)的實(shí)例變量.
由于Test5的匿名子類(lèi)沒(méi)有可見(jiàn)的變量值,編譯器會(huì)在下一個(gè)范圍內(nèi)查找替代方法.在這種情況下,下一個(gè)范圍屬于靜態(tài)main方法.編譯器發(fā)現(xiàn)Test5的實(shí)例變量,并發(fā)出警告,因?yàn)闊o(wú)法從靜態(tài)上下文引用實(shí)例變量.
你有兩個(gè)選擇:
>使實(shí)例變量可供匿名類(lèi)訪問(wèn):
受保護(hù)的int值;
>或使靜態(tài)main方法可以訪問(wèn)變量:
private static int value;
我從你的問(wèn)題中得出結(jié)論,第一個(gè)選擇是你真正想做的事情.
@Tom:問(wèn)題不在于首先搜索靜態(tài)范圍.如果是這種情況,則替代(1)將不起作用,因?yàn)槿匀皇紫日业綄?shí)例變量值,但仍然無(wú)法引用.
@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();
}
}
此示例代碼模仿您的類(lèi)的行為.如果編譯并執(zhí)行它,您將看到輸出為“1 0”.
雖然(A)中的匿名子類(lèi)的實(shí)例初始化程序看起來(lái)像是將一個(gè)賦值給它自己的值實(shí)例變量,但該變量實(shí)際上只能在匿名類(lèi)的超類(lèi)中可見(jiàn).相反,在第(A)行,唯一一個(gè)名為value的可見(jiàn)變量是Test5A實(shí)例的實(shí)例變量,在該實(shí)例上調(diào)用instanceMethod().因此,它變?yōu)橐粋€(gè).
現(xiàn)在讓我們提高價(jià)值的可見(jiàn)度:
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”.實(shí)例變量值由匿名子類(lèi)繼承,并且對(duì)于其實(shí)例初始化程序是可見(jiàn)的.因此,將一個(gè)分配給正確的實(shí)例變量.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java私有instance_java – Instance Initializer与私有成员的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: days matter怎么换背景图(Ma
- 下一篇: 游戏gs是什么意思 4399小游戏