【发布时间】:2011-04-12 04:39:52
【问题描述】:
考虑这些类中的int a 变量:
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() { this.a += 5; System.out.print("b " ); }
}
public class test {
public static void main(String [] args){
Foo f = new Bar();
f.addFive();
System.out.println(f.a);
}
}
我知道方法addFive()在子类中已经被覆盖,并且在类测试中,当引用子类的基类引用被用来调用被覆盖的方法时,会调用addFive的子类版本.
但是公共实例变量a 呢?当基类和派生类有相同的变量时会发生什么?
上述程序的输出是
b 3
这是怎么发生的?
【问题讨论】:
-
我对代码做了一些更改,但无法理解发生了什么。我在 Bar 中添加了一个显示方法并在 main 中调用它,但出现编译器错误。在 Foo 中也添加了一个显示方法,但令人惊讶的是 bar 的显示已执行。这是 Java 的缺陷吗?
-
@SrujanBarai 这是多态性。编译时间:早期绑定:检查发生在引用类型上。运行时间:后期绑定:调用实际对象的类型。
标签: java