本篇主要对构造器 Constructor 不能被 override 的原因进行讲述。(篇幅较短就不列出目录了^_^)
1、为什么构造器 Constructor 不能被 override
另一种说法则是:构造器不能被继承(not inherited)?
首先看一下 Oracle 官网原话:[1]The Java™ Tutorials : Inheritance https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.
结合Oracle官网和stackoverflow上的相关说明如下:
- 1、构造器并不是成员 members ,不会被子类继承,不存在继承关系,因此也就不存在 override (重写) 的问题。
- 1、另外方法重写(override),针对的是方法签名一样的,而父类和子类的构造器都是以类名命名(且没有返回值),明显不符合这个原则,而且也只能通过 new 进行使用;更何况不能通过子类引用的调用来直接 new 父类。(参考后面例子说明)
- 注:Class Members 有哪些,参考:[2]8.2. Class Members https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2
- 3、所有类都继承Object,也因此都会有个无参构造器,会破坏OO设计原则;对于某些类来说是个破坏性很强的设计(下面这个例子);也因此无法定义私有的构造器。
FileInputStream stream = new FileInputStream();
至于构造器为什么不是成员members? 本质上来讲,构造器是用于创建特定对象,是一种专属操作。
- 举个例子,通过 B 引用来直接调用 new A() 说不通,而且这是用于创建类型 A 的实例对象,和 B 没有直接相关,也不知道是 2B 还是 AB、甚至可能是 SB 。
class A { A(); } class B extends A{ B(); }
2、构造器的重载
构造器同样存在着重载overload,当然只会出现在同一个类中。构造器的重载其实就是参数列表不一样,与访问权限修饰符无关。
3、参考
- [1]Inheritance https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
- [2]8.2. Class Members https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2
- [3]8.1.6. Class Body and Member Declarations https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.6
- [4]Understanding Class Members https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
- [5]Providing Constructors for Your Classes https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
- [6]Why are constructors not inherited in java? https://stackoverflow.com/questions/18147768/why-are-constructors-not-inherited-in-java
- [7]Java Constructor Inheritance https://stackoverflow.com/questions/1644317/java-constructor-inheritance
- [8]@Override not supported for Constructors https://stackoverflow.com/questions/18737552/override-not-supported-for-constructors
- [9]Why Constructors are not inherited? https://stackoverflow.com/questions/18415488/why-constructors-are-not-inherited
- [10]牛客网上相关的一道讨论题 https://www.nowcoder.com/questionTerminal/d62b845d28d84870a3e06380fc0e0dae?toCommentId=1496845