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我知道如何编译和运行,但我得到了我编写的后一个结果。