Java类如何没有no-arg构造函数?

off*_*fex 17 java constructor

Oracle Java教程网站的这一段令我困惑:

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

如果所有对象直接或间接地从Object继承,那么如何引出编译器拒绝?是否与私有的构造函数有关?

Ste*_*n C 31

如果所有对象直接或间接地从Object继承,那么如何引出编译器拒绝?

我认为基础是你的误解是,你的是构造继承.实际上,构造函数不是用Java继承的.请考虑以下示例:

public class A {
    public A(int i) { super(); ... }
}

public class B extends A {
    public B() { super(); ... }
}
Run Code Online (Sandbox Code Playgroud)

班级A:

  • 不继承任何构造函数Object,
  • 没有显式声明一个no-args构造函数(即public A() {...}),和
  • 没有默认构造函数(因为它确实声明了另一个构造函数).

因此,它只有一个构造函数:public A(int).

super()B类中的调用尝试使用不存在的no-args构造函数A并给出编译错误.要解决这个问题,您需要更改B构造函数以使用A(int)构造函数,或者在中声明一个显式的no-args构造函数A.

(顺便说一下,构造函数没有必要显式地调用超类构造函数......就像我已经完成的那样.但是很多人认为包含显式调用是一种好的方式.如果你把它遗漏掉,那么Java编译器插入对超类no-args构造函数的隐式调用...如果no-args构造函数不存在或子类不可见,则会导致编译错误.)

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

不是直接的.但是,声明构造函数private将阻止从子类调用该构造函数.

  • 很好的解释.使它更清晰.谢谢你,感谢所有回答的人.我接受这个答案不是因为它是唯一正确的答案,而是因为它对我来说是最全面和最清楚的. (3认同)

Arj*_*jms 15

要理解的关键是,如果类没有构造函数,则只会自动生成no-arg构造函数.

因此,创建一个没有no-arg构造函数的类很容易.


Tec*_*ker 9

想到这个问题最简单的方法如下:

  1. 对于您创建的任何类,非args构造函数由Java提供为默认构造函数.

  2. 在你用参数创建自定义构造函数的那一刻,Java说" 嘿,这个类有一个自定义构造函数,所以我不打算创建/提供默认的非args构造函数!"

  3. 因此,现在您的类没有默认的非args构造函数.

  4. 这意味着当您创建子类时,基于您的类,您需要显式调用您创建的基于自定义构造函数的参数.