在java中实例化子类时,会自动调用父类构造函数

时间:2013-08-24 05:49:51

标签: java

abstract class A {
    abstract void method();
}

class B extends A {
    B() {
    }

    void method() {
    }
}

class C extends B {
    C() {
    }
}

当我在main中实例化C类时,它会自动调用B(父类)的构造函数。这是正常的还是我做错了什么?

4 个答案:

答案 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的工作原理。 你应该读一读。