class A{
    public String f(D obj){return ("A and D");}
    public String f(A obj){return ("A and A");}
}
class B extends A{
    public String f(B obj){return ("B and B");}
    public String f(A obj){return ("B and A");}
}
class C extends B{}
class D extends B{}class TestComplexPoly{
    public static void main(String[] args){
        A a1 = new A();                     
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        //System.out.println(a1.f(b));  // A and A
        //System.out.println(a1.f(c));   //A and A
        //System.out.println(a1.f(d));   //A and D
--------------------------------------------------------------
        System.out.println(a2.f(b));   //B and A
        System.out.println(a2.f(c));   //B and A
        问题就是这两个为什么会是B and A 呢
--------------------------------------------------------------        //System.out.println(a2.f(d));   //A and D
        //System.out.println(b.f(b));    //B and B
        //System.out.println(b.f(c));    //B and B
        //System.out.println(b.f(d));    //A and D                                              
    }
}

解决方案 »

  1.   

    这个以前不就 贴过了么?
    早绑定和晚绑定        System.out.println(a2.f(b));   //B and A
            System.out.println(a2.f(c));   //B and A
    就相当于a2.f((A)b)
            a2.f((A)c)  //b,c都是a的子类
    其实就是早绑定
      

  2.   

    好题。其实关键在于由由基类指针指向派生类造成的多态的前提条件是:多态函数的实现必须由函数链传递实现。如题,a2是类A的基类指针,指向了派生类A。但是,在类A中只定义了函数f(A obj),而没有定义函数f(B obj),所以,通过a2只能引用到B的函数f(A obj),如果你在A中定义函数f(A obj){},则上述结果就完全变为“B and B”了,因为这是能够通过A的f(B obj)传递引用到B的f(B obj)了。
      

  3.   

    对不起,写错了。如果你在A中定义函数f(B obj),则上述结果就完全变为“B and B”了,因为这是能够通过A的f(B obj)传递引用到B的f(B obj)了。
      

  4.   

    System.out.println(a2.f(b)); //B and A
    System.out.println(a2.f(c)); //B and A
    问题就是这两个为什么会是B and A 呢首先a2.f(b)编译的时候对应A类中的f(A a)方法,然后在运行时刻动态绑定,所以执行子类的f(A a)
    下面a2.f(c)同理
      

  5.   

    http://community.csdn.net/Expert/topic/5232/5232770.xml?temp=.1836054
    这里有你这个问题的答案