我有一个具有另一个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
}
}
答案 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;
}
}