JAVA中父类里的private方法能否被重写的问题,请看下面图片!!!

该程序中fun()调用的是父类中print()方法,输出 “父类”

与上个程序不同在于父类中print()权限变为缺省,但是结果却不同,为 “子类”,为什么呢?

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

细看下一、二两点,应该可以解决楼主的困惑。追问

也就是说这涉及到多态机制的问题喽?!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-28
楼主:
访问权限为private的方法是不会被重写的,因为他的可见范围为当前类,出了该类则无法被调用,更别说重写了,由此可想而知:如果父类的某个方法声明为private的,即便子类也定义了该方法且访问范围变大,也只能是两个类中两个不同的方法,而不是重写。

有问题欢迎提问,满意请采纳!
第2个回答  2013-10-28
你确认吗?
按你的代码,两种情形输出的均是"子类"
有重写函数时,按实际类型调用
就算是定义成Person stu=new Student();
stu.print()输出的也是"子类"
第3个回答  2013-10-28
private方法不会被重写
第二次的print方法没有使用private定义,其可见性是包级别的.所以可以被子类进行重写.
第4个回答  2013-10-28
它都不会被访问到,如何重写?