【问题标题】:Nested Classes, Inner Class嵌套类,内部类
【发布时间】:2014-12-04 10:29:30
【问题描述】:

我在构造函数之后创建了一个对象 d,然后在 main 方法中创建了另一个对象 f。我需要了解为什么 Output 会给出例外 (Exception in thread "main" java.lang.StackOverflowError)。但是,如果我没有在构造函数之后创建对象 d,则程序会成功运行。

public class OuterTwo {
   public OuterTwo() {
       System.out.println("OUTER!");
   }

   OuterTwo d = new OuterTwo();

   public static void main(String[] args) {
       OuterTwo f = new OuterTwo();           
   }
}

【问题讨论】:

  • 我也将感谢一个关于 JAVA 嵌套类的编写和解释良好的教程的来源。
  • 这里没有看到任何嵌套类

标签: java class constructor call


【解决方案1】:

你的代码相当于

public class OuterTwo {
        public OuterTwo() {
            d =new OuterTwo();
            System.out.println("OUTER!");   
        }
      OuterTwo d;
      public static void main(String[] args) {
            OuterTwo f = new OuterTwo();           
      }
    }

这导致了一个无限递归。

【讨论】:

  • 这是一个无限的递归
【解决方案2】:

你在这里犯了一个小错误。使用类似的东西。

public class OuterTwo {

     OuterTwo d;

     public OuterTwo() {
          d =new OuterTwo();
          System.out.println("OUTER!");
     }

     public static void main(String[] args) {
          OuterTwo f = new OuterTwo();           
     }
}

为了更好地理解InnerNested 类,请点击这些链接。

Inner classNested class

【讨论】:

    【解决方案3】:

    您遇到堆栈溢出。这是可以理解的。 您的 OuterTwo 类实例化 OuterTwo 类型的成员。 您有一个无限的构造函数调用来创建 OuterTwo 对象,该对象包含对 OuterTwo 对象的引用,一次又一次......一遍又一遍。

    【讨论】:

      【解决方案4】:

      因为你的类被定义为有这个字段,

      OuterTwo d = new OuterTwo();
      

      相当于

      OuterTwo d;
      public OuterTwo() {
        d = new OuterTwo(); // <-- this is infinite recursion.
        System.out.println("OUTER!");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        • 2014-02-11
        • 2010-09-09
        • 1970-01-01
        相关资源
        最近更新 更多