1. 程式人生 > >淺談java編譯型別和執行型別

淺談java編譯型別和執行型別

背景:去某五星級酒店面試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的過載。