我可以从静态内部类访问外部类的字段吗?

Kar*_*way 19 java

我有一个有另一个static内部类的类:

class A {
    private List<String> list;

    public static class B {
        // I want to update list here without making list as static 
        // I don't have an object for outer class
    }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*rey 11

您通常使用静态类时,你并不需要访问实例变量.如果需要访问实例变量,则使类非静态.


anu*_*ava 7

从其他答案可以看出,你需要一个非静态的内部类来做到这一点.

如果你真的不能使你的内部类非静态,那么你可以在外部类中添加所需的getter和setter方法,并通过从内部静态类内部创建外部类的实例来访问它们:

public class A {
    private List<String> list = new ArrayList<String>();
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public static class B {
        // i want to update list here without making list as static
        void updList() {
            A a = new A();
            a.setList(someOtherList);
            System.out.println(a.getList());
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • 添加 getter 和 setter 在这里没有相关性,只需通过“a.list”访问该字段即可执行相同的操作。关键点是创建一个新的“A”实例。但正如[此评论](/sf/ask/1239042171/#comment66802412_17701360)已经说过的,使用`A` 的临时实例没有持久效果。 (3认同)
  • 这是否真的是一个解决方案,考虑到表达式A的对象在表达式A A = new A();`只是本地的,具有初始值?你能详细说明吗? (2认同)

ars*_*jii 5

不,您需要一个非static内部类来执行此操作。

JLS§8.5.1开始

static关键字可能修改成员类型的声明C一个非内部类或接口的主体内T。它的作用是声明它C不是内部类。正如的静态方法T在其体内没有T的当前实例,C也没有的当前实例一样T,它也不具有任何词法包围的实例。

如果一个static类包含封闭类的非静态成员的用法,则是编译时错误。