[英]Can Anonymous inner class instantiated within a static method has access to instance members of containing class?
我想更好地理解包含類的實例字段對Anonymous內部類(AIC)的可見性。
有很多關於AIC隱含引用包含類的實例的討論( 當它確實是泄漏安全使用(匿名)內部類時? )。 使用該邏輯,即使在靜態方法中實例化AIC,它也應該可以訪問包含類的實例字段。 但是由於編譯器出錯,我無法找到測試方法。
例如,在下面的代碼中,我得到:當我在AIC的print()方法中引用's'時,編譯器“無法從靜態上下文中引用非靜態字段' :
public interface TestInterface {
void print();
}
public class AICTest {
public String s = "something";
public static void main( String[] args ) {
new TestInterface() {
@Override
public void print() {
System.out.println( s ); **<-- compilation error**
}
}.print();
}
}
你能否建議AIC實例是否可以在上面的例子中訪問's'?
編輯/回答我想澄清一點,我知道靜態方法可以訪問類成員,實例方法可以訪問實例和類成員。 混淆更多的是關於AIC總是隱含引用包含類'對象的一般聲明。 對於在靜態方法中初始化的AIC,情況顯然不是這樣。 @shmosel共享一個回答我的問題的鏈接( 是否有可能在Java靜態中創建匿名內部類? ): “因此靜態上下文中的匿名類大致相當於靜態嵌套類,因為它不保留對封閉的類,即使它在技術上不是靜態類。“
你必須有一個AICTest實例才能讀出's',因為's'是一個實例變量。 這是一個可行的示例,表示您的示例被修改為訪問可能來自任何地方的現有AICTest對象:
class AICTest {
public String s = "something";
public static void main( String[] args ) {
AICTest aic = new AICTest();
new TestInterface() {
@Override
public void print() {
System.out.println(aic.s);
}
}.print();
}
}
要清楚,運行'main'不會創建AICTest的實例。 你必須在某個地方做一個'new'來創建一個AICTest實例。
另一種選擇是讓's'靜止。 然后它不與任何特定的AICTest對象相關聯,因此即使您沒有實例化AICTest對象它也存在:
class AICTest {
public static String s = "something";
public static void main( String[] args ) {
new TestInterface() {
@Override
public void print() {
System.out.println(s);
}
}.print();
}
}
如您所見,我沒有添加任何可見性修飾符。 所以關於可見性的想法是合理的。 如果訪問“s”是有意義的,那么代碼中就會顯示可見性。 這里的問題與可見性無關。
這可能不是你想要的,但你可以:
interface TestInterface {
void print();
}
class AICTest {
public String s="something";
public static void main(String[] args) {
AICTest aicTest=new AICTest();
new TestInterface() {
@Override public void print() {
System.out.println(aicTest.s);
}
}.print();
}
}
混淆更多的是一般的哲學,即AIC總是隱含地引用包含類的對象。 對於在靜態方法中初始化的AIC,情況顯然不是這樣。 @shmosel共享一個回答我的問題的鏈接(是否有可能在Java靜態中創建匿名內部類?):“因此靜態上下文中的匿名類大致相當於靜態嵌套類,因為它不保留對封閉的類,即使它在技術上不是靜態類。“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.