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,public A() {...}),和因此,它只有一个构造函数:public A(int).
super()在B类中的调用尝试使用不存在的no-args构造函数A并给出编译错误.要解决这个问题,您需要更改B构造函数以使用A(int)构造函数,或者在中声明一个显式的no-args构造函数A.
(顺便说一下,构造函数没有必要显式地调用超类构造函数......就像我已经完成的那样.但是很多人认为包含显式调用是一种好的方式.如果你把它遗漏掉,那么Java编译器插入对超类no-args构造函数的隐式调用...如果no-args构造函数不存在或子类不可见,则会导致编译错误.)
是否与私有的构造函数有关?
不是直接的.但是,声明构造函数private将阻止从子类调用该构造函数.
想到这个问题最简单的方法如下:
对于您创建的任何类,非args构造函数由Java提供为默认构造函数.
在你用参数创建自定义构造函数的那一刻,Java说" 嘿,这个类有一个自定义构造函数,所以我不打算创建/提供默认的非args构造函数!"
因此,现在您的类没有默认的非args构造函数.
这意味着当您创建子类时,基于您的类,您需要显式调用您创建的基于自定义构造函数的参数.
| 归档时间: |
|
| 查看次数: |
35131 次 |
| 最近记录: |