abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
当我在main中实例化类C时,它会自动调用B(父类)的构造函数。这是正常的还是我做错了什么?父类构造函数在java中实例化子类时自动调用
abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
当我在main中实例化类C时,它会自动调用B(父类)的构造函数。这是正常的还是我做错了什么?父类构造函数在java中实例化子类时自动调用
没有什么不对,有暗示调用super
构造函数。
你还没有编写任何类C
的构造函数,所以默认的构造函数将由编译器提供。
C(){
super();
}
如果提供了默认的构造函数,则会调用super()
。 在你的情况下,C extends B
所以B
构造函数被调用。
如果您没有任何其他班的班级,那么默认情况下它也延伸Object
班。所以Object
类的构造函数会被调用。
java中每个构造函数的第一行调用super
构造方法,即java如何工作。 你应该阅读它。
只有当你不在这里调用一个重载的'this()'。 –
如果构造体不明确的构造 调用和正在申报的构造开始不是 原始类对象的一部分,然后在构造函数体隐含开始 与超类构造函数调用“超级( );”,其直接超类的构造函数调用 ,它不带任何参数。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7
当你实例化一个C会有构造函数调用C,B,A,和对象。 C必须能够像任何直接或间接的超类一样行事,并具有所有领域的领域。 X类构造函数的作用是使对象初始化为X.
如果没有声明的构造函数,编译器会创建一个无参数的构造函数,因此每个类都至少有一个构造函数。如果不是Object构造函数的构造函数不是以“this”或“super”构造函数调用开始的,则编译器将其视为以“super();”开始,即对直接超类的无参数构造函数的调用。
+1解释构造函数链。 –
@PaulBellora这是构造函数重载。链接隐式地发生在继承树上(Prasad解释过)或者使用super()(也可能会重载)。 –