在准备 OCJP 考试时,我偶然发现了一个我无法全神贯注的问题。这是(由我稍微修改)来自一个问题的代码:
class Foo {
public int a = 3;
public void addFive() {
a += 5;
System.out.print("f ");
}
}
class Bar extends Foo {
public int a = 8;
public void addFive() {
a += 5;
System.out.print("b ");
}
}
public class TestInheritance {
public static void main(String [] args) {
// part 1
Foo f = new Bar();
f.addFive();
System.out.println(f.a);
// part 2
Bar b = new Bar();
b.addFive();
System.out.println(b.a);
}
}
输出是:
b 3
b 13
第 2 部分我可以理解。这里没有什么奇怪的。但是第 1 部分不让我晚上 sleep 。我明白为什么 Bar.addFive
运行了,但为什么在第 1 部分 f.a
打印 Foo.a
当我使用 new Bar()
来实例化一个对象?看起来继承对方法的工作方式与对变量的工作方式大不相同。我在这里缺少什么来理解这个概念?我失败了什么?
最佳答案
It looks like inheritance works quite different for methods then for variables.
更准确地说,继承不会使变量多态。当您声明相同的方法时,派生类中的方法会覆盖基类中的方法。当您声明一个相同的变量时,基类中的变量被派生类中的变量隐藏。
在您的示例中,Bar
有两个变量 a
, 但只有一种方法 addFive()
.本质上,每个 Bar
对象包含两个整数 - Foo.a
和 Bar.a
.这两个是独立的变量。然而,addFive
方法是在 Bar
中定义的方法,因为它覆盖(替换)addFive
来自 Foo
.
请注意,Java 让 Bar
访问Foo.addFive
调用super.addFive()
, 但 Bar
的用户缺乏这种可能性。
关于java - 方法的继承与变量的继承有何不同?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24842116/