Java类怎么可能没有无参数构造函数?

2022-09-02 11:13:54

Oracle Java教程网站有这样一段让我感到困惑:

所有类都至少有一个构造函数。如果类未显式声明任何值,则 Java 编译器会自动提供一个无参数构造函数,称为缺省构造函数。此默认构造函数调用类父级的无参数构造函数,如果类没有其他父项,则调用 Object 构造函数。如果父级没有构造函数(Object 确实有一个构造函数),编译器将拒绝该程序。

如果所有对象都直接或间接地继承自 Object,那么如何可能引发编译器拒绝呢?这是否与构造函数是私有的有关?


答案 1

如果所有对象都直接或间接地继承自 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()BABA(int)A

(顺便说一句,构造函数不必显式调用超类构造函数...就像我所做的那样。但是很多人认为包含显式调用是一种很好的风格。如果省略它,Java 编译器会插入对超类 no-args 构造函数的隐式调用...如果 no-args 构造函数不存在或对子类不可见,则会导致编译错误。

这是否与构造函数是私有的有关?

不直接。但是,声明构造函数私有将阻止从子类调用该构造函数。


答案 2

要了解的关键是,只有当类还没有构造函数时,才会自动生成 no-arg 构造函数。

因此,很容易创建一个没有无参数构造函数的类。