因为 void method1() 是声明为private 的,你把private 去掉就得到你想要的结果了。

解决方案 »

  1.   

    声明为private 的 method1() 没有被Child复写,因此Child的method1() 与 Praent的method1()是分别独立的。
      

  2.   

    因为method1()是private 所以没有被Child继承,因此通过method2()调用的只能是parent的method1()
      

  3.   

    私有方法是不会被子类继承的
    Child里面的mothed1()实际上是自己的
    跟父类的不相干
      

  4.   

    为什么obj.method2();不会调用Child的method1()?
    请问楼主,这是什么意思?
    你调用的就是method2()啊,Child里没有method2(),当然调用其父类的啊
      

  5.   

    我指的是method2()里的那句method2();为什么不调用Child的method1()?
      

  6.   

    我指的是method2()里的那句method1();为什么不调用Child的method1()?
      

  7.   

    chenjie_0706(陈洁),能具体解释一下"类内部优先原则"吗?
      

  8.   

    子类应该也能继承父类的私有函数的吧?只是就算继承了也不能使用他而已,所以在TIJ中说到class不能是私有的(P187,2nd cn).
      

  9.   

    这个是由于你没有使用虚函数.虚函数与重载函数形成的多态.你这种多态叫静态时多态.只有虚函数才会有运行时多态.由于你定义的时候obj是定义的父类.这样就会调用父类的这个函数.如果是运行时多态就会根据你的实例化的对象,真实的对象中的函数.
      

  10.   

    class parent
    {
     private void method1()
     {
      System.out.println("Parent's method1()");
     }
     public void method2(Child c)
     {
      System.out.println("Parent's method2()");
      c.method1();
     }
    }class Child extends parent
    {
     public void method1()
     {
      System.out.println("Child's method1()");
     }
     public static void main(String args[])
     {
      Child c = new Child();
      parent obj=new Child();
      obj.method2(c);
     }
    }我猜想楼主的思想是想用paret里的method2()去调用Child里的method1()函数,如果是这样的话,那么我想应该在调用父类的method2()时传递一个子类的引用给它,然后再用这个子类的引用去调用子类的方法,不知道我说得对不对,请大家指正.
      

  11.   

    明白楼主的意思了,方法的重写必需是一模一样的才行,这跟方法重载不一样.父类的方法:private void method1()
    子类的方法:public void method1()这两个的修饰符是不一样,所以不形成函数重写,如果将它们的修饰符改成一样就可以实现楼主的想法了.
    如果这两个方法是在同一个类里,那可以形成函数重载,因为函数重载只需参数表类型或个数不同,修饰符可以不同,而函数重写需要完全相同.
      

  12.   

    不知道xxzxzx(xxzxzx)为什么要搞那么复杂,如果想实现调用Parent的method2()然后调用Child的method1()方法的话,直接把父类method1()方法改为public,这样就让子类的method1()实现了重写method1()方法,根据Java调用对象方法里面的动态绑定的原则,自然会运行子类的method1()方法。
    Java调用对象方法的执行过程:
    1、编译器检查对象声明类型和方法名;
    2、编译器检查方法调用中提供的参数类型;
    3、如果方法是private、static、final的,或者是一个构造器,编译器就能准确地知道应该调用哪个方法。(称为静态绑定)对于其他方法,根据隐式参数的实际类型来决定,在运行时执行动态绑定。
    4、当程序运行并且使用动态绑定方法时,虚拟机就必须调用同obj所指向的对象的实际类型相匹配的方法。
    从这个程序看,首先obj会检查Parent和Child两个类里面所有的method2()方法,发现只有Parent类里面有method2()方法,所以就执行它;然后继续检查method1()方法,发现Parent和Child类里面各有一个,这时编译器发现Parent类里面的方法是private,所以执行静态绑定,运行Parent类里面的method1()方法。
    如果将Parent类里面的method1()方法改为public,则会变成动态绑定,根据第4个原则,执行Child类里面的method1()方法。
      

  13.   

    谢谢angues1980(石头心) 
    这下我对静态帮定明白多了.
      

  14.   

    呵呵,客气了,共同提高嘛~!
    其实我也懵懵懂懂,看了贴后实践了一下,然后再查书才明白的:)
    大家对Java的机制理解越深才能编出更好的程序
      

  15.   

    to angues1980(石头心):
     如果写成
    public class Parent
    {
     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 void method2() {
    System.out.println("Child's method2()");
    }

    public static void main(String args[]) {
    Parent obj = new Child();
    obj.method1();

    //Child obj0 = new Parent();

    }
    }
    在eclipse下显示的obj.method1 为什么会是parent.method1呢?运行的结果却是Child's method1()
    还望多多指教
      

  16.   

    父类私有方法 private void method1()
    静态branding
      

  17.   

    其实不管是用eclipse、jbuilder、jcreator哪个,都是只会点出来Parent的方法,因为他们都是开发环境为了方便编写程序而设计的功能,它们的只会根据对象声明时候的类型来选择方法(比如:你可以先声明然后进行编程,然后在必要的时候再构造初始化对象),而真正执行动态绑定是在编译器运行程序的时候,根本和你的开发环境没关系。所以IDE对继承的多态支持的不太好啊 :)
      

  18.   

    flyer05(flyer) public static void main(String args[]) {
       Parent obj = new Child();
       obj.method1();
    }
    你这个就是属于后期绑定正好与静态绑定向反,多态就是后期绑定,属于向上转型,Java的内部机制会找到相应的method执行的。
     -------
    | Parent|
     -------
        ↑
     -------
    | Child |
     -------
      

  19.   

    我想大家可能是在说两点:
    1.向上转换问题(UP—CASTING)问题,就是说子类和父类的关系是IS-A关系,不过我目前还是对这个不太明白,希望大家能给我讲解一下啊,在这个例子中:
        Parent obj = new Child(); //创建的过程是怎么样的呢?是不是先是右边通过类Child的构造函数
                                  //创建一个Child的对象,然后赋给Parent的对象obj 呢?
    由此我还有对强制转换的问题
       比如:int a;
            folat 3f;
            a=(int)(3f+1);
        这个就是强制转换啊,可int 和float是不同的数据类型,和父类子类的继承有什么关系呢? 上面的问题是不是能有一个原理来解释呢?2.override重置/复写的问题
     这个词在英语里好象是超越的意思,这里涉及的是子类继承父类时override父类方法的问题,
     好象原则是只能使开放度变的更私有,就是说public->private而不能private->public.这就应该和
    真正执行机制有关系对吗?有介绍JVM执行机制的资料推荐吗?谢谢!
      

  20.   

    Parent obj = new Child(); //new Child()是子类的一个实例,obj是父类声明的一个变量,他引用子类的实例;或者说是用子类的实例来实例化父类的对象。
    偶是这么理解的!
      

  21.   

    比如new Child(),这里每个子类对象其实都是隐含的包含了一个父类的对象的,所以JVM执行的时候,首先要构造一个父类的对象即首先调用父类的构造函数,如果其父类还有父类的的话还要更先构造父类的父类对象,这样继承才可以有保障。另外,如果父类有static类型的实例或者静态块的时候还要首先初始化static的实例。比如对程序作下面的修改,你就可以了解继承时构造子类对象的调用顺序。
    class Parent
    {
     static
     {
      System.out.println("Parent's static block");
     }
     public Parnet()
     {
      System.out.println("Parent's constructor");
     }
     private void method1()
     {
      System.out.println("Parent's method1()");
     }
     public void method2()
     {
      System.out.println("Parent's method2()");
      method1();
     }
    }class Child extends Parent
    {
     static
     {
      System.out.println("Child's static block");
     }
     public Child()
     {
      System.out.println("Child's constructor");
     }
     public void method1()
     {
      System.out.println("Child's method1()");
     }
     public static void main(String args[])
     {
      Parent obj=new Child();
      obj.method2();
     }
    }
    建议好好看看TIJ的有关继承的章节,里面讲的很清楚。
      

  22.   

    还有就是如果去掉我上面程序中父类的method2()方法,而在子类中添加method2()方法的话,这个程序是不能通过编译的。虽然父类的引用可以指向子类对象的实例,这也是java继承中重要的多态性,但是由于它本身声明的时候还是父类,而父类中是没有method2()方法的。