我试图理解 Java 继承中方法重写、构造函数调用和变量隐藏的行为。我有以下代码
class Base {
int id = 1000; //Line n1
Base() {
Base(); //Line n2
}
void Base() { //Line n3
System.out.println(++id); //Line n4
}
}
class Derived extends Base {
int id = 2000; //Line n5
Derived() {} //Line n6
void Base() { //Line n7
System.out.println(--id); //Line n8
}
}
public class Test {
public static void main(String[] args) {
Base base = new Derived(); //Line n9
}
}
当我运行此代码时,它输出-1。
我理解Derived扩展了Base,并且两个类都有一个id 变量和一个Base() 方法。顺序如下
- 调用 Derived 的构造函数
- 调用Base的构造函数
- 调用Base()方法,由于方法重写,执行子类中的方法。
因此,我认为结果将是 1001。
这是由 Java 构造函数的工作方式决定的。
this.super()
即使代码中没有写明,构造函数的第一个指令也始终是。当
this.super()
被调用时,变量不受影响并具有其默认值(对于 int 为 0)。因此,您要从 id 中删除 1(等于 0)。
您可以用此代码进行测试:
输出将是:
但是,如果你的主要内容是:
那么你的输出将如下所示:
这是因为,在这种情况下:
this.super()
(Object 对象的构造函数)this.super()
已经被调用)id
+ 1。此处描述的行为可能会在 Java 的未来版本(Java 23 之后)中发生变化。我们正在努力使构造函数更加灵活。请参阅JEP 482:灵活的构造函数主体(第二个预览版)。