public class A{
 public void f(){
System.out.println("A.f()");
}
}
public class B extends A{
public void f(){
System.out.println("B.f()")
}
}
public class C{
public void g(A a){
System.out.println("g(A a)");
a.f();
}
public void g(B b){
System.out.println(g(B b));
b.f()
}}
然后运行:
C c=new C();
A a=new B();
c.g(a);
为什么结果是
g(A a)
B.f()

解决方案 »

  1.   

    经典的多态呀。java一般函数的执行是动态绑定的,也就是说执行的时候才会把你的调用连接到实际的代码上。
    A a=new B(); a实际上是B类型的对象,所以执行的时候只要B覆盖了基类的f方法,就会执行他自己的f
      

  2.   

    什么是多态呢?所谓多态就是父类引用指向子类对象,也是表现了面向对象一个思想,增强类的健壮性和代码的复用性。尤其是
    A a=new B();更是个最好的例子,编译时候看左边(的方法),运行看右边(的方法)。
      

  3.   


    对对我的问题就是为什么执行函数g()的时候 是执行g(A a)而不是g(B b)
      

  4.   


    对对我的问题就是为什么执行函数g()的时候 是执行g(A a)而不是g(B b)
    这么和你解释,A a = new B();如果调用一个a.f();,他会先从父类中寻找这个方法,然后再查询子类是否重写了这个方法,如果重写了就用子类的,反之父类的
      

  5.   

    记得a叫做B的上转型对象,对象a可以调用A类的属性和方法,和B类继承和修改了的属性和方法,而B类新添加的则不能使用。 
      

  6.   

    public class A       //A 父类。 定义了成员方法f
    {
      public void f()
      {
         System.out.println("A.f()");
      
      }
    }
    public class B extends A{  //B是 A的子类,对继承自A父类的f方法不满意,重写了f方法。
     
       public void f()
       {
         System.out.println("B.f()")
       }
    }
    /*
     C驱动类,等价与下面:
     
     A a = new B();
     
     a.f()          
     java中的方法默认都是虚方法,可以直接重写。由于B重写了父类A的f方法,所以,
     
     即便是用父类A的引用a调用方法f,也是调用的B类实中的f。因为a指向的本身就是B类对像b。
     
     这就是多台的表现。所以,应该注重引用的对象是什么类型,而不是引用变量是什么类型。
     
    */