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();
}
}

解决方案 »

  1.   

    因为public void method1()重载了Parent的method1()
      

  2.   

    Parent p=new Child();
    p.method2();
    将调用Child继承Parent的method2();
    method2()中又调用了method1()
    Parent的method1()被重写
    所以将调用Child的method1()
      

  3.   

    首先,Child继承了Parent的method2(),而且并没有overwrite它,
    所以子类的method2()和父类的method2()结果应该完全相同
    无论你的methd2()调用了谁,你创建的引用(reference)是父类还是子类类型,都对结果没有影响以此为前提,则你的程序中
    (new Parent()).method2()与(new Child()).mehod2()打印结果是完全相同的
    即Parent's method2()
      Parent's method1()内部机制不懂,所以只能在这个层面上理解呵呵,希望对你有帮助
      

  4.   

    从java 虚拟机的内部机制来说,private方法是由invokespecial指令来触发的。而一般方法由invokevirtual指令触发,static方法由invokestatic触发。只有invokevitual是动态绑定的。invokespecial触发的函数在大部分情况下都是静态绑定的,所以,你那个private方法也是被静态绑定的,也就是跟你声明的类型是一致的。
    鉴定完毕。
      

  5.   

    首先,
    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()
      

  6.   

    所以父类method2()中的method1()不会被子类调用.应改为:所以父类method2()中的method1()不会是子类中的method1().
      

  7.   

    Tester p=new Child();不明白大家解释这么大堆...还涉及到内部机制层面..模模糊糊的..还不知道解释是不是对的
    这句很好理解...声明提Tester 类型 ,引用 了child实例这里注意声明了什么类型,就调用该类型的方法...child虽然继承父类.但是父类的私有方法不能被覆盖....所以显示都是父类
      

  8.   

    这里我比较同意alhu0470的看法
      

  9.   

    我对楼主的代码作了一点修改,如下:
    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修饰的属性或方法,子类不能继承、不能访问、不能重写。
      

  10.   

    Parent's method2()
    Parent's method1()
    这个是输出这不是简单的方法重写
    private void method1(){
    如果是public就是了这里为什么没有被重写?
    有没有达人能仔细解答一下啊?