题目是这样的
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 args[]){
Parent p = new Child();
p.method2();
}
}
答案是:prints: parent’s method2()  parent’s method1()
如果把父类中method1改成public那么答案是prints: parent’s method2()  child’s method1(),请高手指教为什么会这样??谢谢

解决方案 »

  1.   

    Parent p = new Child();
    p.method2();
    =================
    这个是java的多态的应用;P实际上是Child的实例;
    java中的方法除了final修饰的都是动态调用的;所以的动态调用机制是指在运行中根据具体的实例调用相应的方法而不是编译时指定的;
    这就意味着method2应该找Child类中的,如果Child类中没有才会调用Parent类中的;
    对于method1的调用,如果是public,methods2应该是Child中,自然methods1也是从Child类中调用;这里是private,这意味着从methods2方法决定了methods1方法的位置。
      

  2.   

    我试了一下,如果 Parent 中的 method1() 改成 protected,跟改成 public 的效果是一样的,也就是说,实际执行的都将是 Child 中重载的 method1()。
    所以,我得到的结论是,Java 判断是否进行重载的原则是,如果 Parent 中的 method 能够在 Child 中访问到,就能被 Child 中的 method 重载掉;如果访问不到,就不能重载掉。
      

  3.   

    很简单。method1()在父类中是private的,private方法不能构成多态,这样method1()不是一个多态方法,因此不能按照多态的规则来调用。
      

  4.   

    当parent中的method1是private时,他的子类child不能去访问,也就是说不能去重载它,那样.只能调用parent中的method1方法了.
    当parent中的method1是public时,他的子类child可以访问,当然也可以重载了,这样.调用method1方法时.就调用了child中的method1方法了.
      

  5.   

    Dan1980(不用IDE的大傻瓜) 正解