使用外部类访问静态类成员

时间:2012-09-08 15:17:53

标签: java inner-classes static-classes

我有这样的代码我需要在mysample内的InnerClass方法中访问静态类getInnerS()的{​​{1}}变量。我尝试通过为NestedClass创建新对象来访问它,但我得到了InnerClass

java.lang.StackOverflowError

3 个答案:

答案 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();
  }
}