簡體   English   中英

可以在靜態方法中實例化的匿名內部類是否可以訪問包含類的實例成員?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM