首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于一道有关'多态'的面试题,该怎么处理

2012-02-20 
关于一道有关多态的面试题classA{publicStringf(Dobj){return( AandD )}publicStringf(Aobj){return(

关于一道有关'多态'的面试题
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
这里有你这个问题的答案
[解决办法]
好题

热点排行
Bad Request.