淺談java編譯型別和執行型別
阿新 • • 發佈:2018-12-11
背景:去某五星級酒店面試vi**,面試官拿出一段程式碼然購物寫輸出結果。考察點是:編譯型別和執行型別以及過載和覆蓋
話不多說,程式碼如下:
class A{ public void show(A obj){ System.out.println("AA"); } public void show(C obj){ System.out.println("AC"); } } class B extends A{ public void show(B obj){ System.out.println("BB"); } @Override public void show(A obj){ System.out.println("BA"); } } class C extends B{} class D extends B{} public class Test4 { public static void main(String[] args){ A a=new B(); B b=new B(); C c=new C(); D d= new D(); a.show(a); a.show(b); a.show(c); a.show(d); b.show(b); } }
大家可以自己寫一下答案。
輸出結果為:
BA
BA
AC
BA
BB
解析:
對於 A a=new B();
編譯階段物件a的型別是A, 執行時其型別為B,這種編譯和執行時型別不一致的情況就是一種多型的體現。
因為a的編譯型別是A,所以a.show()方法只能去呼叫B類覆蓋A類的方法或A類的方法。
因此,a.show(a),a.show(b),a.show(d)均呼叫的是B中的show(A obj)方法。
a.show(c)呼叫的是A中的show(C obj)方法
b.show(b)呼叫的是B中的show(B obj)該方法實際上是B類特有的方法,他與B中的show(A obj)又構成了Java的過載。