class Foo{
public int a;
public Foo(){
a=3;
}
public void addFive(){
a+=5;
}
}
class Bar extends Foo{
public int a;
public Bar(){
a=8;
}
public void addFive(){
this.a+=5;
}
}
public class Test2 {
public static void main(String[] args){
Foo f = new Bar();
f.addFive();
System.out.println(f.a);
}
}
为什么输出地是3?怎样理解Foo f=new Bar()?
Bar继承Foo,Bar中有两个a,一个继承来的,一个自己定义的;Bar中有两个addFive,一个继承来的,一个自己定义的
Foo f = new Bar();语法是可以的,因为子类对象可以看成是父类对象,因此被父类引用变量指向,但是此时如果调用addFive,默认调用子类自己的addFive,此乃多态;而调用变量a,则默认还是继承来的a,所以是3。
你可以试一试下面的代码,看看输出就知道原因了:
class Foo {
public int a;
public Foo() {
a = 3;
}
public void addFive() {
System.out.println("Foo's a is " + a);
a += 5;
}
}
class Bar extends Foo {
public int a;
public Bar() {
a = 8;
}
public void addFive() {
System.out.println("Bar's a is " + a + ":Foo's a is " + super.a);
this.a += 5;
}
}
public class Exec {
public static void main(String[] args) {
Foo f = new Bar();
f.addFive();
System.out.println(f.a);
}
}