题目是这样的
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(),请高手指教为什么会这样??谢谢
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(),请高手指教为什么会这样??谢谢
p.method2();
=================
这个是java的多态的应用;P实际上是Child的实例;
java中的方法除了final修饰的都是动态调用的;所以的动态调用机制是指在运行中根据具体的实例调用相应的方法而不是编译时指定的;
这就意味着method2应该找Child类中的,如果Child类中没有才会调用Parent类中的;
对于method1的调用,如果是public,methods2应该是Child中,自然methods1也是从Child类中调用;这里是private,这意味着从methods2方法决定了methods1方法的位置。
所以,我得到的结论是,Java 判断是否进行重载的原则是,如果 Parent 中的 method 能够在 Child 中访问到,就能被 Child 中的 method 重载掉;如果访问不到,就不能重载掉。
当parent中的method1是public时,他的子类child可以访问,当然也可以重载了,这样.调用method1方法时.就调用了child中的method1方法了.