原因是你子类Bar里面又定义了字段a,
Bar里的public int a;并未复写父类Foo的public int a;
也即构造时,有两个a,这两个a是不同的。主方法改成如下这般,可以直观显示:
public static void main(String[] args) {
Foo foo = new Bar();
System.out.println(foo.a);
foo.addFive();
System.out.println(foo.a);
Bar bar = (Bar)foo;
System.out.println(bar.a);
}