abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
当我在 main 中实例化类 C 时,它会自动调用 B(父类)的构造函数。这是正常的还是我做错了什么?
abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
当我在 main 中实例化类 C 时,它会自动调用 B(父类)的构造函数。这是正常的还是我做错了什么?
没有错,有对super
构造函数的隐式调用。
您还没有为类编写任何构造函数,C
因此默认构造函数将由编译器提供。
C(){
super();
}
如果提供了默认构造函数,则调用super()
. 在你的情况下,C extends B
所以构造函数B
被调用。
如果你没有一个类与任何其他类,那么默认情况下它也扩展Object
类。所以Object
类构造函数将被调用。
如果构造函数体不是以显式构造函数调用开始并且被声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式以超类构造函数调用“super();”开始 ,对其直接超类的构造函数的调用,不带参数。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7
当你实例化一个 C 时,会有 C、B、A 和 Object 的构造函数调用。AC 必须能够充当任何直接或间接超类,并且具有所有这些超类的字段。类 X 构造函数的工作是使正在初始化的对象能够作为 X 工作。
如果没有声明的构造函数,编译器会创建一个无参数的构造函数,所以每个类都至少有一个构造函数。如果不是 Object 构造函数的构造函数不以“this”或“super”构造函数调用开头,编译器会将其视为以“super();”开头,即对直接超类的无参数构造函数的调用。
java中每个构造函数的第一行调用super
构造函数,这就是java的工作原理。你应该阅读它。