在java中实例化子类时,会自动调用父类构造函数
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(父类)的构造函数。这是正常的还是我做错了什么
# 1 楼答案
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7
# 2 楼答案
没有什么错,有对
super
构造函数的隐式调用您还没有为类
C
编写任何构造函数,所以编译器将提供默认构造函数,该编译器将如果提供了默认构造函数,则会调用
super()
。 在您的例子中,C extends B
所以B
的构造函数被调用如果您不使用任何其他类创建一个类,那么默认情况下它也会扩展
Object
类。因此Object
类构造函数将被调用# 3 楼答案
java中每个构造函数的第一行调用
super
构造函数,这就是java的工作方式。 你应该读一读# 4 楼答案
当你实例化一个C时,会有C、B、a和Object的构造函数调用。C必须能够表现为任何直接或间接的超类,并且具有所有超类的字段。X类构造函数的工作是使被初始化的对象能够作为X类构造函数工作
如果没有声明的构造函数,编译器将创建一个无参数构造函数,因此每个类都至少有一个构造函数。如果不是对象构造函数的构造函数没有以“this”或“super”构造函数调用开头,编译器将其视为以“super();”开头,对直接超类的无参数构造函数的调用