日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java私有instance_java – Instance Initializer与私有成员

發布時間:2023/12/31 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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与私有成员的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。