Java 主叫太多的课?

Java 主叫太多的课?,java,inheritance,Java,Inheritance,我在编写程序时遇到了一些意想不到的结果。我有三个类,它们都可以正确编译,但是当我运行它们时,它们似乎没有将正确的输出写入控制台。根据我的主要方法,我应该得到一个结果,显示: Extender called ClassTest called 然而,它写道: AbsClass called Extender called ClassTest called 我在ClassTest类构造函数中使用了一个super(),但它应该只调用父类,对吗 这是第一节课: public abstract clas

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

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();
    }
}

如果您继承了类,则始终为所有祖先调用构造函数

如果不使用
super(参数)
指定它,则默认情况下会调用
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");
    }
}
不可编译


(重要的是:若类并没有构造函数,那个么隐式自动创建的构造函数不带任何参数)

若您继承了类,那个么总是为所有祖先调用构造函数

如果不使用
super(参数)
指定它,则默认情况下会调用
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");
    }
}
不可编译


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

如果有一个构造函数没有以显式调用this()
super()
开始,则编译器会自动插入对默认超类构造函数的调用。从:

如果构造函数体不是以显式构造函数调用开始,并且所声明的构造函数不是原始类对象的一部分,则构造函数体隐式地以超类构造函数调用“super();”开始,这是对其直接超类的构造函数的调用,不带任何参数


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

如果您的构造函数没有以显式调用
this()
super()
开始,那么编译器会自动插入对默认超类构造函数的调用。从:

如果构造函数体不是以显式构造函数调用开始,并且所声明的构造函数不是原始类对象的一部分,则构造函数体隐式地以超类构造函数调用“super();”开始,这是对其直接超类的构造函数的调用,不带任何参数


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

“如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。”我得到了预期的结果。。。。怎么了?你知道如何编译和运行java吗?@Suzon我知道如何编译和运行,但我得到了我写的后一个结果。“如果构造函数没有显式调用超类构造函数,java编译器会自动插入对超类的无参数构造函数的调用。”我得到了你期望的结果。。。。怎么了?你知道如何编译和运行java吗?@Suzon我知道如何编译和运行,但我得到了我编写的后一个结果。