我试图理解 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() 方法。顺序如下
因此,在我看来,结果将是1001。
这是因为 java 构造函数的工作方式。
构造函数的第一条指令将始终是
this.super()
,如果代码中未编写事件。
调用
this.super()
时,变量不受影响并具有默认值(整数为 0)。
因此,您要从 id 中删除 1(等于 0)。
您可以使用此代码进行测试:
class Base {
int id = 1000;
Base() {
System.out.println("Super called");
Base();
}
void Base() {
System.out.println("Base called");
System.out.println(++this.id);
}
}
class Derived extends Base {
int id = 2000;
Derived() {
System.out.println("==Super finished==");
Base();
}
void Base() {
System.out.println("Derived base called");
System.out.println(--this.id);
}
}
public class test {
public static void main(String[] args) {
new Derived();
}
}
输出将是:
Super
Derived base called
-1
==Super finished==
Derived base called
1999