构造函数是否可能超越?

Gop*_*pal 27 java constructor overriding

我所知道的是,编译器在字节码中编写了一个默认的无参数构造函数.但是如果我们自己编写它,那么构造函数会自动调用.这种现象是构造函数的重写吗?

Col*_*inD 23

构造函数不是常规方法,它们不能被"覆盖".假设可以重写构造函数意味着超类构造函数是可见的,可以调用它来创建子类的实例.这不是真的......默认情况下,子类没有任何构造函数(如果它扩展的类有一个,则为无参数构造函数除外).它必须显式声明任何其他构造函数,并且那些构造函数属于它而不属于它的超类,即使它们采用与超类构造函数相同的参数.

你提到的默认没有arg构造函数的东西只是构造函数工作方式的一个方面,与覆盖无关.


Edd*_*res 21

你所描述的并不是最重要的.如果未指定默认构造函数,编译器将创建默认构造函数.如果它是一个子类,它将调用默认的父构造函数(super()),它还会将所有实例变量初始化为由类型的默认值确定的默认值(数字类型为0,布尔值为false,对象为null) .

当子类具有相同的名称,参数的数量/类型以及与超类的实例方法相同的返回类型时,会发生覆盖.在这种情况下,子类将覆盖超类的方法.有关覆盖的信息.


sgo*_*les 13

永远不可能.构造函数覆盖在Java中是不可能的.

这是因为,

构造函数看起来像一个方法,但名称应该是类名,没有返回值.

覆盖意味着我们在Super类中声明的内容,我们必须在Sub类中声明它被称为Overriding.超类名称和子类名称是不同的.

如果您尝试在Sub类中编写超类构造函数,则Sub类会将其视为方法而不是构造函数,因为name不应与Sub类名匹配.它会给出一个编译错误,即方法没有返回值.所以我们应该声明为void,然后才会编译.


看看下面的代码:

Class One
        {
         ....
         One() { // Super Class constructor
          .... 
        }

        One(int a) { // Super Class Constructor Overloading
          .... 
        }
 }

Class Two extends One
                   {
                    One() {    // this is a method not constructor 
                    .....      // because name should not match with Class name
                   }

                    Two() { // sub class constructor
                   ....  
                   }

                   Two(int b) { // sub class constructor overloading
                   ....
                  }
 }  
Run Code Online (Sandbox Code Playgroud)


jzd*_*jzd 5

您可以有许多构造函数,只要它们接受不同的参数即可。但是编译器放入默认构造函数并不称为“构造函数重写”。