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