主叫太多课程?

时间:2014-02-26 18:37:56

标签: java inheritance

编写程序时我有一些意想不到的结果。我有三个类,它们都可以正常编译,但是当我对它们进行编辑时,它们似乎没有将正确的输出写入控制台。基于我的主要方法,我应该得到一个结果显示:

Extender called
ClassTest called

然而,它写道:

AbsClass called
Extender called
ClassTest called

我在ClassTest类构造函数中使用super(),但是这应该只调用父类,对吧?

这是第一堂课:

public abstract class AbsClass {
    public AbsClass() {
        System.out.println("AbsClass called");
    }        
}

这是第二节课:

public class Extender extends AbsClass {
    public Extender() {
        System.out.println("Extender called");
    }
}

这是使用main方法的最后一个类:

public class ClassTest extends Extender {
    public ClassTest() {
        super();
        System.out.println("ClassTest called");
    }

    public static void main(String[] args){
        ClassTest test = null;
        test=new ClassTest();
    }
}

2 个答案:

答案 0 :(得分:2)

如果你有继承的类,那么构造函数总是为所有祖先调用。

如果您未使用super(parameters)指定,则默认情况下会调用super()

请注意,如果祖先具有带参数的构造函数且没有没有参数的构造函数且其扩展类未指定要调用的构造函数,则代码将变为不可编译。

示例:

public abstract class AbsClass {
    public AbsClass(String text) {
        System.out.println("AbsClass called: " + text);
    }        
}

public class Extender extends AbsClass {
    public Extender() {
        System.out.println("Extender called");
    }
}

不可编辑。

(重要的是:如果类没有构造函数,则隐式自动创建的构造函数不带参数)

答案 1 :(得分:2)

如果您的构造函数不以显式调用this()super()开头,则编译器会自动插入对默认超类构造函数的调用。来自Java Language Specification (§8.8.7)

  

如果构造函数体不是以显式构造函数调用开始并且声明的构造函数不是原始类Object的一部分,那么构造函数体隐式地以超类构造函数调用“super();”开头,调用它的直接超类的构造函数,不带参数。

因此,当AbsClass()的构造函数开始执行时,将调用默认构造函数Extender