代码如下:
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类的对象,是么?
谢谢!

解决方案 »

  1.   

    问题:
    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方法 下面的也同上 解释语言不是很流畅 楼主谅解
      

  2.   

    1、这段代码里不是定义了一个父类的对象a么,为什么调用fun1()方法是子类中重写过的内容,不是应该是父类中的内容么?
    定义的是A类的对象,传实参传的是B的实例,所以调用的是B的方法,要不怎么能实现多态?
    2、重载的时候fun(new B()) 可以直接这么写?建立一个B类的对象,是么?
    是的
    三点建议:
    1:楼主再认真看一下多态,A a是形参,实参你传入的是B的实例
    2:代码格式调整一下,方便他人阅读
    3:做人要厚道,问题解决了要结贴
      

  3.   

    用生活中的东西来解释:
    现在你需要一个苹果,也就像方法需要一个参数。public void fun(A a);A你可以看成是你需要的苹果,
    现在呢有一个是青苹果(酸的),有一个是红苹果(甜的)。
    如果这个时候给你的是青苹果,那么你就咬一口觉得是酸的。
    如果给你是红苹果,那么你咬一口觉得是甜的。
    那么青苹果就像B对象,红苹果也就相当于是C对象。
    而酸的,甜的。也都是他们各自的方法咯。不知道这样说你能理解吗
      

  4.   

    1.这是动态绑定。 即在执行时判断所引用对象的实际类型,
      根据实际类型调用其相应的方法。所以调用fun1()方法是
      子类中重写过的内容。
    2.是。
      

  5.   

    public class PolDemo05{
        public static void main(String asrgs[]){
            A b = new B();
            a.fun1() ;
            A c = new C();
            c.fun1() ;
        }
    }  这样会好理解点吧。