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

一个关于对象多态的问题,新手求助
代码如下:
class A{ // 定义类A
public void fun1(){ // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ; // 调用fun1()方法
}
};
class B extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){
System.out.println("B --> public void fun3(){}") ;
}
};
class C extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("C --> public void fun1(){}") ;
}
public void fun5(){
System.out.println("C --> public void fun5(){}") ;
}
};
public class PolDemo05{
public static void main(String asrgs[]){
fun(new B()) ; // 传递B的实例
fun(new C()) ; // 传递B的实例
}
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
};


问题:
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
1、这段代码里不是定义了一个父类的对象a么,为什么调用fun1()方法是子类中重写过的内容,不是应该是父类中的内容么?
2、重载的时候fun(new B()) 可以直接这么写?建立一个B类的对象,是么?
谢谢!

------解决方案--------------------
问题:
public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}
1、这段代码里不是定义了一个父类的对象a么,为什么调用fun1()方法是子类中重写过的内容,不是应该是父类中的内容么?
2、重载的时候fun(new B()) 可以直接这么写?建立一个B类的对象,是么?


1,这段代码是里的a是A的对象的对象 
但fun(new B()) ; // 传递B的实例
fun(new C()) ; // 传递B的实例

调用了这个方法public static void fun(A a){
a.fun1() ; // 调用覆写父类中的fun1()方法
}并传递了两个对象 所以调用的是B类和C类中重写过的方法 先调用的是fun(new B())可以看成 A a=new B() 然后找A类的fun1方法 发现被覆盖了 就是在A类中该方法已经不存在了 所以调用的是B类的fun1方法 下面的也同上 解释语言不是很流畅 楼主谅解