如果所有对象都直接或间接地继承自 Object,那么如何可能引发编译器拒绝呢?
我认为你的误解的基础是你认为构造函数是继承的。实际上,构造函数在 Java 中不是继承的。因此,请考虑以下示例:
public class A {
public A(int i) { super(); ... }
}
public class B extends A {
public B() { super(); ... }
}
课程:A
- 不从 继承任何构造函数。
Object
- 不显式声明无参数构造函数(即 ),并且
public A() {...}
- 没有默认构造函数(因为它确实声明了另一个构造函数)。
因此,它有一个且只有一个构造函数:。public A(int)
类中的 to 调用尝试在 中使用不存在的 no-args 构造函数,并给出编译错误。要解决此问题,您需要更改构造函数以使用构造函数,或者在 中声明显式的 no-args 构造函数。super()
B
A
B
A(int)
A
(顺便说一句,构造函数不必显式调用超类构造函数...就像我所做的那样。但是很多人认为包含显式调用是一种很好的风格。如果省略它,Java 编译器会插入对超类 no-args 构造函数的隐式调用...如果 no-args 构造函数不存在或对子类不可见,则会导致编译错误。
这是否与构造函数是私有的有关?
不直接。但是,声明构造函数私有将阻止从子类调用该构造函数。