1、这种结果是正确的。
2、具体原因如下:
一,第一种情况输出“父类”,是由于子类中并没有重写fun方法,而且父类的print方为private为不可重写,虽然你的子类中看上去重写了,其实是两个无关print方法,只是方法名而已,在多态调用的时候,只会直接找父类的print方法,故导致你在子类Student对象中调用fun方法时,实际是调用父类的private。
二,第二种情况输出“子类”,是由于子类中重写了父类的print方法,按照多态机制,调用fun方法时的print执行,实际执行的是子类的重写后的print方法,故输出为“子类”。
3、其实核心就是多态调用的方法栈和方法的可视范围。
4、建议做如下测试,然后自己再总结总结
**可以将父类的private改成protected或是public
**让子类重写下父类的fun方法,形式为public void fun(){print())即可。
细看下一、二两点,应该可以解决楼主的困惑。
追问也就是说这涉及到多态机制的问题喽?!