Java基础(003):为什么构造器 Constructor 不能被 override

   本篇主要对构造器 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 父类。(参考后面例子说明)
  • 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、参考

 

posted @ 2021-01-24 22:56  心明谭  阅读(386)  评论(0编辑  收藏  举报