【问题标题】:java abstract class, Constructor not called in super-class, Why?java抽象类,构造函数没有在超类中调用,为什么?
【发布时间】:2013-01-02 12:55:44
【问题描述】:

下面是一个简单的例子。我有两个抽象类AB,一个具体类C,其中包含抽象方法。

当我创建一个新的C 时,我希望看到AB 的构造函数被调用。知道为什么不调用它们吗?

//Q.java
class Q {
    abstract class A {
        A() {
            System.out.println("in A");
        }
        public abstract void sayHi();
    }
    abstract class B extends A {
        B() {
            super();
            System.out.println("in B");
        }
    }
    class C {
        C() {
            super();
            System.out.println("in C");
        }
        public void sayHi() {
            System.out.println("Hi!");
        }
    }

    Q() {
        C Ccc = new C();
    }

    public static void main(String[] args) {
        Q z = new Q();
    }
}

【问题讨论】:

  • 类 c 不扩展 b 或 a... 你应该写 `class c extends b{ ...`
  • c 不继承 a 或 b。所以你并没有真正重写方法
  • 井 c 不扩展 b 或 a
  • 我已将您的类重命名为大写名称,因为这是通常的约定。否则可能会让人难以阅读。

标签: java class constructor abstract


【解决方案1】:

因为c的超类是Object

其他类名以大写字母A,B,C,etc开头

如果你想同时看到 ab 被调用,请执行以下操作:

class c extends b

【讨论】:

    【解决方案2】:

    您的类c 没有扩展类ba,因此它不能使用super() 调用它们的构造函数,而是调用Object 构造函数。

    试试这个:

    class c extends b {
        public c(){
            super();
            //...
        }
    }
    

    【讨论】:

    • 这在技术上是不正确的。如果cab 组成,它当然可以调用其中任何一个构造函数。
    • 对,我完成了答案:) 感谢您指出这一点。
    • 感谢您的回答。感谢您提供代码。
    【解决方案3】:

    看,我们有所有类都隐式扩展的超类 Object。所以如果我们有 public class A{} 那么就相当于写 public class A extends Object{} 。 但是如果你想扩展你自己的另一个类,那么你必须明确提到它 public class B extends A{} 否则 java 会将 Object 视为您的超类。 (注意:即使在这种情况下,对象也是“B”的超类,但这是因为它是“A”的超类,因此是“B”的超类)。因此,如果您没有明确提及“B 扩展 A”,那么 B 类将拥有 Object 作为其唯一的超类。 此外,您不需要在子类构造函数中提及 super() 。这也被隐式调用。

    【讨论】:

      【解决方案4】:

      你应该从c类扩展抽象类。

      class c extends b {
      

      不显式扩展b,相当于

      class c extends Object {
      

      因此,调用super 会调用Object 构造函数。

      【讨论】:

        【解决方案5】:

        随便制作:

        class c extends b{
        

        它现在可以工作了..你还没有在 c 中扩展 b..

        【讨论】:

          【解决方案6】:

          CB 没有任何关系。 C 的超类默认为java.lang.Object

          C 应该像 B 一样扩展

          class C extends B{ .. }
          

          在这种情况下,它会调用超类的构造函数。

          此外,您无需显式调用super(),因为它隐式存在。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-04-23
            • 2012-01-14
            • 2018-09-10
            • 2014-08-09
            • 2012-12-25
            • 1970-01-01
            相关资源
            最近更新 更多