2016-09-26 141 views
0

當我在java中學習多態概念時,問題就引發了。如以下代碼表示:java如何確定對象的實際類型?

public class test { 
    public static void main(String[] args){ 
     testF(new B()); 
    } 
    public static void testF(A a){ 
     a.f(); 
    } 
} 
class A{ 
    public void f(){System.out.println("method in super class");} 
} 
class B extends A{ 
    public void f(){System.out.println("mehtod in sub class");} 
} 

testF方法需要一個類的參數,但我們通過一個類B參考,這是一類的子類。編譯很高興接受它,並且由於多態機制,當我們調用引用'a'上的方法f()時,在「實際類型」中聲明的方法將獲得。我的問題是,當我們將一個新的構建對象B傳遞給testF()時,它已經被上傳到類A,那麼java怎麼才能得到它的實際類型呢?

+0

在Java中調用多態方法時發生* no *轉換。這正是運行時多態性的作用:運行時查看與當前類型關聯的「調度表」(是的,Java將類型信息與每個對象實例存儲在一起[見Object#getClass()'](https:// docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--),例如),其中發出方法調用。 – user2864740

回答

1

Java爲每個對象保留一個虛擬方法表(AKA調度表),以便知道在運行時調用哪個f

它還跟蹤大約喜歡什麼類他們是...等

注意,實際上並沒有達到投在這個意義上,你在想一個實例對象相關的元上下的信息。運行時執行最少量的安全/類型檢查,但除此之外,它使用虛擬方法表來查找在調用時要運行的方法。

相關問題