问题描述
在Java中, 重载正在创建具有相同名称但签名不同的方法,而重载正在创建具有相同名称和签名相同的方法。
那么,当我们在JAVA的子类中创建构造函数时,会发生重载还是覆盖?
解决方法
都不是。构造函数与方法不同。通过在同一个类中而不是在继承的类中编写多个构造函数,可以重载一个构造函数。而且构造函数不受覆盖。如果我调用new X("Hi")
,我知道我正在调用在X
中定义和实现的构造函数,而不是在X
的某些子类中重写或继承的构造函数来自X
的某些超类。
构造函数声明不是成员。它们从不继承,因此不受隐藏或覆盖。
所以它不是覆盖。而且由于构造函数没有被继承,所以当您在子类中声明构造函数时,也不会在超级类中重载构造函数。但是它是:
- 重载在同一类中声明的其他构造函数(如果有),或者;
- 如果之前未声明构造函数,请替换默认构造函数。
一个类由成员(字段或方法)和构造函数组成-完全不同。但是您想进行概念比较。
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中有多个构造函数。