【问题标题】:Calling a subclass constructor from a superclass从超类调用子类构造函数
【发布时间】:2016-05-08 15:42:14
【问题描述】:

我第一次在 java 中遇到继承,我遇到了构造函数的问题。

考虑 A 类

class A{
    ...(Constructor) {
        ...
        ObjectCreatedBySubClass= new B();
        }
    ...(etc)


    protected static B    ObjectCreatedBySubClass;    
}

连同它的子类

class B extends A{
    B(){
    ..(No matter what code I put here, it does not work.)
    }


    ...(Instance variables)
}

无论我改变什么,每次我得到

Exception in thread "main" java.lang.StackOverflowError
at A.<init>
at B.<init>
(repeat about 100 times)

我的教授解释说,我不应该像这里那样“扩展”“拥有”关系。我将使用组合而不是继承来解决我的问题,但我的问题是

我不明白为什么会出现此问题。由于(我假设)某种无限循环,它内存不足,但我不知道为什么。 在这种情况下,我该如何正确使用继承?

任何帮助将不胜感激。

【问题讨论】:

    标签: java inheritance constructor


    【解决方案1】:

    这是因为当你构造A时,你在里面构造B,当子类的构造函数被调用时,超类的构造函数也被调用。所以它进入了一个无限循环。

    【讨论】:

      【解决方案2】:

      由于 B 扩展了 A,每次调用 B 的构造函数时,也会调用 A 的构造函数。但是,在 A 的构造函数的实现中,您实例化了一个 B,它在构造时调用 A 的构造函数。这种循环依赖永远不会被破坏,这会导致你的堆栈溢出。

      【讨论】:

      • 哇!非常感谢!我认为解决这个问题的唯一方法是使用组合?否则我只需要在 A 的构造函数之外创建一个对象的实例,对吗?
      • 如果不了解您要达到的目标,就很难回答这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2013-10-20
      相关资源
      最近更新 更多