【问题标题】:Access static class member using the outer class使用外部类访问静态类成员
【发布时间】:2012-09-02 03:44:05
【问题描述】:

我有这样的代码,我需要在getInnerS() 方法中访问静态类InnerClassmysample 变量,该方法位于NestedClass 内。我尝试通过为InnerClass 创建一个新对象来访问它,但我得到了java.lang.StackOverflowError

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);
    }
    static class InnerClass{
        private String mysample = "Inner Class"; //InnerClass instance variable,
        NestedClass a = new NestedClass();
        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 = new NestedClass.InnerClass(); 
         nestedClass.getOuterS();
         nestedClass.getInnerS();
         nestedInner.getIn();
         nestedInner.getOut();
    }
}

【问题讨论】:

    标签: java inner-classes static-classes


    【解决方案1】:

    InnerClass构造函数中:

    NestedClass a = new NestedClass(); 
    

    所以,你创建一个新的NestedClass,它创建一个新的InnerClass,它自己创建自己的NestedClass,对应的InnerClass....难怪stackoverflow。

    如果你想访问封闭类,你应该使用(在InnerClass方法中)

    NestedClass.this   
    

    【讨论】:

    • 我更改并删除了 NestedClass a = new NestedClass();并更改为 System.out.println(NestedClass.this.outer);在内部类中,但我收到编译错误,提示“在范围内无法访问 NestedClass 类型的封闭实例”
    【解决方案2】:
    NestedClass a = new NestedClass();
    

    在静态 InnerClass 类中创建 NestedClass 的实例,并且 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();
    }
    
    
    }
    

    【讨论】:

    • 非常感谢......Nahuel Fouilleul 我明白了......如果你不介意你能说我们为什么在那里使用它......??
    • +1 用于删除静态允许使用NestedClass.this
    • 如果 InnerClass 是静态的,则它不能访问非静态的外部类的成员,但如果不是,则至少有一个外部类的实例可以访问,即创建嵌套实例的那个。抱歉,如果不清楚,也许其他人可以更好地解释
    • 静态内部类与普通的外部级别类完全相同,只是它的名称隐藏在父类之下。它的唯一目的是允许快速创建类,而不必为每个类创建一个新文件。没有静态这个词,这些类是完全不同的:在它们创建时(即,当我们从这些子类创建一个对象时),它们的父对象的地址(父对象的“this”的值)作为隐藏传递每个参数;因此给了他们访问父级非静态成员的可能性。
    【解决方案3】:

    有了这个解决方案,成员类是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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 2018-10-05
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      相关资源
      最近更新 更多