2013-07-17 77 views
15

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

静态嵌套类不具有外部对象的任何实例的隐式引用。您需要将它传递给您希望修改的实例的引用。为什么B类是静态的? –

+0

B类正在为UI显示生成一个模板结构,现在我正在执行一些操作来获取值,并且需要设置为周围的类。这是一个设计问题吗? –

+0

如果您需要每个B实例与特定的A实例关联,并且能够对其进行操作,最简单的解决方案是使B非静态,并在构建时建立关系。 –

回答

6

你可以从你将需要一个非静态内部类做其他的答案见。

如果你真的不能让你的内部类的非静态那么您可以在外部类添加必需的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()); 
     } 
    } 
} 
+1

这真的是一个解决方案,考虑到类A中的对象在表达式'A a = new A();'中只是局部的,它的初始值?你能详细说明一下吗? – misty

+0

你想要做什么与内部类? – anubhava

8

您通常使用静态类时,你需要访问实例变量。如果您需要访问实例变量,则该类不是静态的。

2

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

JLS §8.5.1

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

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

0

在你的代码,listA类的一个实例变量,B是嵌套静态类。访问静态和非静态成员的规则不会因嵌套的静态类而改变。

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

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

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; 
     } 
    } 
相关问题