当我们在JAVA中创建构造函数时,它是重载还是被重写?

问题描述

在Java中, 重载正在创建具有相同名称但签名不同的方法,而重载正在创建具有相同名称和签名相同的方法

那么,当我们在JAVA的子类中创建构造函数时,会发生重载还是覆盖?

解决方法

都不是。构造函数与方法不同。通过在同一个类中而不是在继承的类中编写多个构造函数,可以重载一个构造函数。而且构造函数不受覆盖。如果我调用new X("Hi"),我知道我正在调用在X中定义和实现的构造函数,而不是在X的某些子类中重写或继承的构造函数来自X的某些超类。

,

根据JLS §8.8

构造函数声明不是成员。它们从不继承,因此不受隐藏或覆盖。

所以它不是覆盖。而且由于构造函数没有被继承,所以当您在子类中声明构造函数时,也不会在超级类中重载构造函数。但是它是:

  • 重载在同一类中声明的其他构造函数(如果有),或者;
  • 如果之前未声明构造函数,请替换默认构造函数。
,

一个类由成员(字段或方法)和构造函数组成-完全不同。但是您想进行概念比较。

class A {
    A() { }
}

class B extends A {
    B() {
        System.out.println("Bar");
    }
}

在JVM(Java虚拟机)内部,构造函数签名为A.<init>()

B()在内部实现为:

int field1;
String field2;
String field3 = null;
int field4 = 42;

B() {
    // 1. Explicit or implicit super constructor:
    super(); // A.<init>();

    // 2. All fields with initialisation:
    field3 = null;
    field4 = 42;

    // 3. The remaining code:
    System.out.println("Bar");
}

这看起来像覆盖A.<init>()(虽然不允许@Override),但是基本方法被隐式(无参数)调用,或显式地称为super(...)

重载意味着B中有多个构造函数。