0

根据我的教科书:

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

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

4

4 回答 4

1

不,如果super没有参数的 s 构造函数初始化了一些对象——这个初始化将会完成。

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

B构造函数仍将super()作为第一行调用(即使它没有明确写入),并将x=1在进程中初始化。

于 2012-10-13T23:46:02.447 回答
1

这意味着超类的字段将设置为非参数构造函数设置的任何内容。

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

于 2012-10-13T23:46:47.370 回答
1

不:

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

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

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

于 2012-10-13T23:47:32.860 回答
1

如果这个人粗心并且没有指定他们,我们会得到一个错误吗?

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

  1. 如果类构造函数(显式或隐式)依赖于其超类未提供(显式或隐式)的无参数构造函数,则这是一个编译错误。

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

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

于 2012-10-14T00:07:33.120 回答