在准备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部分不让我晚上入睡。我知道为什么Bar.addFive
运行,但是为什么在我实例化一个对象时在第1部分中f.a
打印?看来方法的继承与变量的继承大不相同。我想了解这个概念的地方是什么?我在做什么?Foo.a
new Bar()
看起来继承对于方法和变量的工作方式大不相同。
更准确地说,继承不会使变量多态。当您声明相同的方法时,派生类中的方法将覆盖基类中的方法。当声明相同的变量时,基类中的变量被派生类中的变量隐藏。
在您的示例中,Bar
有两个变量a
,但只有一个方法addFive()
。本质上,每个Bar
对象都包含两个整数-Foo.a
和Bar.a
。这两个是单独的变量。然而,该addFive
方法是在所定义的一个Bar
,因为它覆盖(取代)addFive
从Foo
。
请注意,Java通过调用允许Bar
访问,但是缺乏这种可能性的用户。Foo.addFive
super.addFive()
Bar
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句