日期:2014-05-20  浏览次数:20646 次

为什么答案不是:parent's method1(),child's method1() ,想不通?
class   Parent{
private   void   method1(){
System.out.println( "Parent 's   method1() ");
}
public   void   method2(){
System.out.println( "Parent 's   method2() ");
method1();
}
}

class   Child   extends   Parent{
public   void   method1(){
System.out.println( "child 's   method1() ");
}
public   static   void   main(String   arg[]){
Parent   p=new   Child();
p.method2();
}
}


------解决方案--------------------
因为public void method1()重载了Parent的method1()
------解决方案--------------------
Parent p=new Child();
p.method2();
将调用Child继承Parent的method2();
method2()中又调用了method1()
Parent的method1()被重写
所以将调用Child的method1()
------解决方案--------------------
首先,Child继承了Parent的method2(),而且并没有overwrite它,
所以子类的method2()和父类的method2()结果应该完全相同
无论你的methd2()调用了谁,你创建的引用(reference)是父类还是子类类型,都对结果没有影响

以此为前提,则你的程序中
(new Parent()).method2()与(new Child()).mehod2()打印结果是完全相同的
即Parent 's method2()
Parent 's method1()

内部机制不懂,所以只能在这个层面上理解呵呵,希望对你有帮助


------解决方案--------------------
从java 虚拟机的内部机制来说,private方法是由invokespecial指令来触发的。而一般方法由invokevirtual指令触发,static方法由invokestatic触发。只有invokevitual是动态绑定的。invokespecial触发的函数在大部分情况下都是静态绑定的,所以,你那个private方法也是被静态绑定的,也就是跟你声明的类型是一致的。
鉴定完毕。
------解决方案--------------------
楼上的是牛人,鉴定完毕,不过我一句不懂~~~~
------解决方案--------------------
同意 bruni(不如你)
------解决方案--------------------
首先,
Parent p=new Child();是 多态 的一种形式,虽然 new 的是Child的构造方法,但是确是父类Parent的类型,这叫作 "p被 声明 为Parent类型, 引用 Child实例 ".请记住以下原则:

1)对于一个引用类型的变量,JAVA编译器按照它声明的类型来处理
2)对于一个引用类型的变量,运行JAVA虚拟机按照实际引用的对象来处理

在这段程序中,p 本应该调用的是Child类的method2(),但是子类 Child类中没有这个方法,就会发生子类的对象转换为父类类型,在父类Parent类中有method2(),转换成功,如果父类Parent类中没有method2(),转换就会失败.实例方法与实际引用的对象的方法绑定,属于动态绑定,在运行时由JAVA虚拟机动态决定.

该程序中很重要的是在父类Parent类method1()是private的,只能在父类中调用,所以父类method2()中的method1()不会被子类调用.

输出结果: Parent 's method2()
Parent 's method1()
------解决方案--------------------
Tester p=new Child();

不明白大家解释这么大堆...还涉及到内部机制层面..模模糊糊的..还不知道解释是不是对的
这句很好理解...

声明提Tester 类型 ,引用 了child实例

这里注意声明了什么类型,就调用该类型的方法...child虽然继承父类.但是父类的私有方法不能被覆盖....所以显示都是父类

------解决方案--------------------
这里我比较同意alhu0470的看法
------解决方案--------------------
我对楼主的代码作了一点修改,如下:
class Parent{
//此处修改.原private改为public
public void method1(){
System.out.println( "Parent 's method1() ");
}
public void method2(){
System.out.println( "Parent 's method2() ");
method1();
}
}

class Child extends Parent{
public void method1(){
System.out.println( "child 's method1() ");
}
public static void main(String arg[]){
Parent p=new Child();
p.method2();
}
}
结果跟我们想象的就相符了,如下:
Parent 's method2()
child 's method1()
所以我觉得这串代码最关键的地方不在于多态性,而在于封装性。即Parent中的method1()为private。private修饰的属性或方法,子类不能继承、不能访问、不能重写。