----------------------
android培训、
java培训、期待与您交流! ----------------------
这里f对象是父类引用,z对象是子类引用
z调用z.num和z.show()毫无疑问是5和showZi
f对象的show()方法已经被子类覆盖(重写),所以f.show()打印的还是
showZi
而f.num却不是5,仍是父类的4
而f.num却不是5,仍是父类的4
因为
子类的实例变量num其实是隐藏了父类的实例变量num,并没有覆盖,由于f是父类引用,所以调用了4
想要打印子类的5,必须转换类型,
Zi p=
(Zi)f; 然后p.num就是5
或者直接System.out.println(((Zi)f).num);
小结一下
Java中变量与方法在继承中的隐藏与覆盖规则:
1、父类的实例变量和类变量能被子类的同名变量隐藏。
2、父类的静态方法被子类的同名静态方法
隐藏,父类的实例方法被子类的同名实例方法
覆盖。
3、不能用子类的静态方法隐藏父类的实例方法,也不能用子类的实例方法覆盖父类的静态方法,否则编译器会异常。
4、用final关键字修饰的最终方法不能被覆盖。
5、
变量只能被隐藏不会被覆盖,子类的实例变量可以隐藏父类的类变量,子类的类变量也可以隐藏父类的实例变量。