继承多态疑惑_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 继承多态疑惑

继承多态疑惑

 2014/5/7 10:11:33  equals  程序员俱乐部  我要评论(0)
  • 摘要:classA{publicStringshow(Dobj){return("AandD");}publicStringshow(Aobj){return("AandA");}}classBextendsA{publicStringshow(Aobj){return("BandA");}publicStringshow(Bobj){return("BandB");}}classCextendsB{}classDextendsB{}publicclassMultiTest
  • 标签:继承
class="java" name="code">class A {  
    public String show(D obj){  
           return ("A and D");  
    }   
    public String show(A obj){  
           return ("A and A");  
    } 
}   
class B extends A{ 
    public String show(A obj){  
           return ("B and A");  
    }   
    public String show(B obj){  
           return ("B and B");  
    } 
}  
class C extends B{}   
class D extends B{} 

public class MultiTest{ 
public static void main(String[] args){ 
        A ab = new B();  
        B b = new B();  
        C c = new C(); 
        System.out.println(ab.show(b));   
        System.out.println(ab.show(c)); 
} 
}

输出结果为:
B and A
B and A

以下是我的见解,接触java不久,也不知道具体对不对,但是这是我认为合理的解释:
java有编译期和运行期,当代码编译时候(这个时候还没有内存对象创建),ab编译成的字节码中描述的是A,对你写的第一个ab.show()方法标记的是A中的方法,此时A中没有show(B),所以这个时候b就向上造型为A,show方法标记就为A中的show(A),然后运行期执行的时候,就是调用的内存对象,这个时候show方法要调用的时候就找的是具体对象,即ab调用B中的show,这个时候show()方法调用时,JVM发现在具体对象ab中有重写的show(A)方法,于是就输出的是B and A。
得出这样的结论是因为刚我在我的机器上跑程序的时候,发现,删掉B中的show(A)方法,控制台打印的是A and A;而且将代码A ab = new B()改成B ab = new B()结果就是B and B。
发表评论
用户名: 匿名