以下是运行结果:
我们来分析一下为何会有如下结果:
首先
Parent parent=new Parent();
parent.printValue();
Child child=new Child();
child.printValue();
分别输出父类和子类各自的myValue,100和200没有什么疑问。
接着
parent=child;
parent.printValue();
子类对象赋值给了父类对象父类对象的myValue,以及printValue函数被子类对象覆盖了所以是Child200
parent.myValue++;
parent.printValue();
这时输出的是200可见maValue++中的myValue应该是父类中的。
我们可以验证一下将子类的输出函数改为这样System.out.println("Child.printValue(),myValue="+myValue+" "+super.myValue);
让子类在后面输出父类的myValue。
以下是运行结果:
101说明修改的是父类的。
((Child)parent).myValue++;
parent.printValue();
将父类强制转化为子类,所以修改的是子类的myValue输出了201。
综上所述我们可以得到这样的结论:
子类的同名方法和变量会覆盖父类的方法和变量;
可将子类对象赋值给父类对象,但此时调用的函数是子类的函数,变量时父类的变量;
可以将父类强制转化为子类,从而使用子类的变量。