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

时间:2013-07-17 13:05:54

标签: 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
    }
}

5 个答案:

答案 0 :(得分:11)

需要访问实例变量时,通常使用静态类。如果需要访问实例变量,则使类非静态。

答案 1 :(得分: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());
        }
    }
} 

答案 2 :(得分:4)

不,你需要一个非static内部类才能做到这一点。

来自JLS §8.5.1

  

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

     

如果static类包含封闭类的非静态成员的使用,则为编译时错误。

答案 3 :(得分:1)

在您的代码中,list是类A的实例变量,B是嵌套的静态类。对于嵌套静态类,访问静态和非静态成员的规则不会更改。

  • 变量list是实例变量,因此无法从静态上下文访问。
  • 要启用此功能,您需要将静态nester类更改为内部类。

    class A {
    private List<String> list = new ArrayList<String>();
      public class B {
         public void someMethod(){
             list.add("abc");
         }
      }
    }
    

答案 4 :(得分:1)

private List<String> list;

此处 列表 是一个实例变量,而内部类是静态的,这意味着 B类 是在不同的 A类 实例中相同;一个人无法访问它。而且,这也是一个非常好的和明显的原因。

您可以使用的一个解决方案是将成员 列表 的引用传递给 B类 的构造函数 weakReference 以避免内存泄漏。

这样的事情:

class A {
    private List<String> list;

    public static class B {
        WeakReference<List<String>> innerList;
        //constructor
        B(WeakReference<List<String>> innerList){
            this.innerList = innerList;
        }
    }