关于一道有关'多态'的面试题
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
}
}
[解决办法]
这个以前不就 贴过了么?
早绑定和晚绑定
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的子类
其实就是早绑定
------解决方案--------------------
好题。其实关键在于由由基类指针指向派生类造成的多态的前提条件是:多态函数的实现必须由函数链传递实现。如题,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)了。
[解决办法]
楼上的正解,不过我还是想问下楼上的你说的函数链应该只是覆写的方法吧
[解决办法]
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)同理
[解决办法]
学习中
[解决办法]
http://community.csdn.net/Expert/topic/5232/5232770.xml?temp=.1836054
这里有你这个问题的答案
[解决办法]
好题