最近我偶然发现了Java测试并发现了一个奇怪的行为.
class MainOne {
private int i = 5;
public MainOne() {
System.out.println("MainOne says that I is " + getI());
}
public int getI() {
System.out.println("MainOne getI was used");
return i;
}
}
public class TheTest extends MainOne {
private static int i = 10;
public TheTest() {
System.out.println("TheTest says that I is " + super.getI());
}
public int getI() {
System.out.println("TheTest getI was used");
return i;
}
public static void main(String[] args) {
TheTest test = new TheTest();
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
使用了测试getI
MainOne说我10岁.
使用了MainOne getI
TheTest说我5岁
问题是,发生了什么?为什么Base类使用它后代的方法?
这完全是关于执行顺序和构造函数继承.TheTest构造函数隐式调用super MainOne构造函数.
所以
public TheTest() {
System.out.println("TheTest says that I is " + super.getI());
}
Run Code Online (Sandbox Code Playgroud)
电话
public MainOne() {
System.out.println("MainOne says that I is " + getI());
}
Run Code Online (Sandbox Code Playgroud)
getI()由于多态性而调用覆盖.
public int getI() {
System.out.println("TheTest getI was used");
return i;
}
Run Code Online (Sandbox Code Playgroud)
在i这里是static i中声明TheTest.最后
super.getI());
Run Code Online (Sandbox Code Playgroud)
被调用使用MainOne的i.
你得到了
TheTest getI was used
MainOne says that I is 10.
MainOne getI was used
TheTest says that I is 5
Run Code Online (Sandbox Code Playgroud)
请注意,多态不适用于字段,并且该字段(无论是static或实例)可能隐藏父类中相同名称的字段.
| 归档时间: |
|
| 查看次数: |
4673 次 |
| 最近记录: |