23

我有一个有另一个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
    }
}
4

5 回答 5

16

当您不需要访问实例变量时,通常使用静态。如果您需要访问实例变量,请使类成为非静态类。

于 2013-07-17T13:09:48.097 回答
14

正如您从其他答案中看到的那样,您将需要一个非静态内部类来做到这一点。

如果你真的不能让你的内部类是非静态的,那么你可以在外部类中添加所需的 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());
        }
    }
} 
于 2013-07-17T13:40:06.223 回答
6

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

JLS §8.5.1

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

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

于 2013-07-17T13:12:51.470 回答
1

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

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

    class A {
    private List<String> list = new ArrayList<String>();
      public class B {
         public void someMethod(){
             list.add("abc");
         }
      }
    }
    
于 2013-07-17T13:13:01.157 回答
1

private List<String> list;

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

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

像这样的东西:

class A {
    private List<String> list;

    public static class B {
        WeakReference<List<String>> innerList;
        //constructor
        B(WeakReference<List<String>> innerList){
            this.innerList = innerList;
        }
    }
于 2017-09-09T08:37:32.343 回答