繁体   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