我有这样的代码我需要在mysample
内的InnerClass
方法中访问静态类getInnerS()
的{{1}}变量。我尝试通过为NestedClass
创建新对象来访问它,但我得到了InnerClass
。
java.lang.StackOverflowError
答案 0 :(得分:3)
在InnerClass
构造函数中:
NestedClass a = new NestedClass();
因此,您创建了一个新的NestedClass
,它会创建一个新的InnerClass
,它会创建自己的NestedClass
,并带有相应的InnerClass
....难怪stackoverflow。
如果要访问封闭类,则应使用(内部InnerClass
方法)
NestedClass.this
答案 1 :(得分:1)
NestedClass a = new NestedClass();
静态Inner Class类中的创建了一个嵌套类的实例,而InnerClass是静态的,这是一个循环。
InnerClass不需要是静态的,这应该可以工作
public class NestedClass {
private String outer = "Outer Class"; //NestedClass instance variable
NestedClass.InnerClass innerClass = new NestedClass.InnerClass();
void getOuterS(){
System.out.println(outer);
}
void getInnerS(){
System.out.println(innerClass.mysample);
}
class InnerClass{
private String mysample = "Inner Class"; //InnerClass instance variable,
NestedClass a = NestedClass.this;
void getIn(){
System.out.println(mysample);
}
void getOut(){
System.out.println(a.outer);
}
}
public static void main(String[] args){
NestedClass nestedClass = new NestedClass();
NestedClass.InnerClass nestedInner = nestedClass.innerClass;
nestedClass.getOuterS();
nestedClass.getInnerS();
nestedInner.getIn();
nestedInner.getOut();
}
}
答案 2 :(得分:0)
使用此解决方案,成员类为static
。为了更好的比较,您可能会阅读
Static class declarations
静态嵌套类(描述)
静态嵌套类无法访问外部类的非静态字段和方法,这在某些方面类似于类中定义的静态方法。只能通过外部类的实例引用来访问非静态字段和方法。在这方面,静态嵌套类与任何其他顶级类非常相似。
此外,静态嵌套类可以访问外部类的任何静态方法,包括私有。
这些类的好处主要在于实体的逻辑分组,以改善封装,以及节省类空间。
public class NestedClass{
private static String outer = "Outer Class"; //NestedClass instance variable
InnerClass innerClass = new InnerClass();
void getOuterS(){
System.out.println(outer);
}
void getInnerS(){
System.out.println(InnerClass.mysample);
}
InnerClass getInner(){
return innerClass;
}
static class InnerClass{
private static String mysample = "Inner Class"; //InnerClass instance variable,
void getIn(){
System.out.println(mysample);
}
void getOut(){
System.out.println(outer); //access a static member
}
}
public static void main(String[] args){
NestedClass nestedClass = new NestedClass();
NestedClass.InnerClass nestedInner = nestedClass.getInner();
nestedClass.getOuterS();
nestedClass.getInnerS();
nestedInner.getIn();
nestedInner.getOut();
}
}