子类不调用超类构造函数时的行为

时间:2012-10-13 23:44:24

标签: java

根据我的教科书:

  

如果子类中任何构造函数的执行没有调用a   超类构造函数,Java自动调用无参数   超类的构造函数。

这是否意味着所有超类数据字段(超类变量)都将设置为null(因为构造函数是无参数构造函数)?

4 个答案:

答案 0 :(得分:1)

不,如果没有参数的super构造函数初始化了某些对象 - 这个初始化就完成了。

class A { 
  public int x;
  A () { 
     x = 1;
  }
}
class B extends A { 
  B() { 
  }
}

B的构造函数仍将调用super()作为第一行(即使未明确写入),并将在此过程中初始化x=1

答案 1 :(得分:1)

这意味着超类的字段将被设置为非参数构造函数设置它们。

这可能是也可能不是null。如果没有定义非参数超类构造函数,并且子类的构造函数没有设置超类字段,那么它们将是null

答案 2 :(得分:1)

没有

class A {
    public int x;
    public A() {
        x = 42;
    }
}

class B extends A {}
assert(new B().x == 42)

“无参数构造函数”不必是空构造函数。

答案 3 :(得分:1)

  

如果这个人粗心并且没有指明,我们会收到错误吗?

你还没有说“他们”指的是什么,但是......

  1. 如果类构造函数(显式或隐式)依赖于其超类不提供(显式或隐式)的no-args构造函数,那么这就是编译错误。

  2. 如果程序员意外地遗漏了类中的构造函数,并且其引用字段(仅)默认初始化为null,则不会出现编译错误。 (代码有效。编译器无法确定程序员的意图;即构造函数是否被意外或故意省略。)但是如果某些代码使用字段/ 可能稍后会出现运行时错误字段值假设它为非空。

  3. 如果程序员定义了构造函数但构造函数无法初始化某个字段,则结果与2相同。没有编译错误,可能存在运行时错误。