根据我的教科书:
如果子类中任何构造函数的执行没有调用a 超类构造函数,Java自动调用无参数 超类的构造函数。
这是否意味着所有超类数据字段(超类变量)都将设置为null(因为构造函数是无参数构造函数)?
答案 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)
如果这个人粗心并且没有指明,我们会收到错误吗?
你还没有说“他们”指的是什么,但是......
如果类构造函数(显式或隐式)依赖于其超类不提供(显式或隐式)的no-args构造函数,那么这就是编译错误。
如果程序员意外地遗漏了类中的构造函数,并且其引用字段(仅)默认初始化为null
,则不会出现编译错误。 (代码有效。编译器无法确定程序员的意图;即构造函数是否被意外或故意省略。)但是如果某些代码使用字段/ 可能稍后会出现运行时错误字段值假设它为非空。
如果程序员定义了构造函数但构造函数无法初始化某个字段,则结果与2相同。没有编译错误,可能存在运行时错误。