java抽象类,没有在超类中调用构造函数,为什么?

时间:2013-01-02 12:55:44

标签: java class constructor abstract

下面是一个简单的例子。我有两个抽象类,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();
    }
}

6 个答案:

答案 0 :(得分:6)

因为c的超类是Object

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

开头

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

class c extends b

答案 1 :(得分:3)

您的班级c不会延伸课程ba,因此无法使用super()调用其构造函数并调用Object构造函数

试试这个:

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

答案 2 :(得分:2)

你应该扩展类c中的抽象类。

class c extends b {

没有明确地延伸b,它等同于

class c extends Object {

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

答案 3 :(得分:2)

只需:

class c extends b{

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

答案 4 :(得分:2)

请参阅,我们有超类Object,所有类都隐式扩展。所以,如果我们有 public class A{} 那相当于写作 public class A extends Object{}。 但是如果你想扩展自己的另一个类,那么你必须明确地提到它 public class B extends A{} 否则java会将Object视为您的超类。 (注意:即使是这种情况,Object也是'B'的超类,但这是因为它是'A'的超类,因此是'B'。因此,如果你没有明确提到'B extends A',那么B类将把Object作为唯一的超类。 更多的你不需要在子类构造函数中提到super()。这也是隐含的。

答案 5 :(得分:1)

CB无论如何都不相关。默认情况下,C的超类是java.lang.Object

C应扩展B,如

class C extends B{ .. }

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

此外,您无需明确调用super(),因为它隐含在那里。