2012-10-05 26 views
22

如果在java中沒有編譯時綁定,這是否意味着所有綁定都是在運行時完成的?java中的所有方法都是虛擬的

但按照哎呀概念運行時綁定,函數必須具有虛擬keyword..ARE所有方法隱含在java虛擬還是有在java中

任何編譯時綁定存在。如果有任何編譯時綁定,可以你能給我一些具體的情況,或鏈接到進一步的信息

  1. 靜態(沒有在這裏結合靜態不屬於對象的意思)
  2. 最終(這是不是因爲它可以是一個有效點以另一種方式實現)
+1

「沒有編譯時綁定在java中」 - 不正確。當然,*執行*是在執行時挑選出來的,但是重載解析和檢查方法的簡單行爲存在並且可訪問,聽起來就像是編譯時綁定到我的。或許你的意思是根據你最後一段的「綁定」這個詞的意思。 –

回答

34

所有非static,非final和非private方法在Java中默認是虛擬的。然而,JVM足夠聰明地找到只有一個給定方法實現的類,並將其轉化爲靜態綁定。

這樣你不必記住關於virtual關鍵字(由於在C++的析構函數中丟失了virtual而經歷過內存泄漏?),而性能沒有受到太大的影響。

+1

Ya我們如何證明非靜態的,非私有的方法是虛擬的.. – Arun

+7

@Arun你不需要證明 - 這就是語言的定義。如果需要,可以在[Java語言規範](http://docs.oracle.com/javase/specs/)中查找它。 – Jesper

5

非靜態方法調用是Java的主要(唯一)動態方面。所有的方法在Java中都是虛擬的。這不適用於基於靜態類型的對象在編譯時綁定的靜態方法。從維基的虛擬

4

定義:

在面向對象的編程中,虛擬函數或虛擬方法是一個函數或方法,其行爲可被繼承類內由函數具有相同簽名的覆蓋,以提供多態行爲。

因此根據定義,JAVA中的每個非靜態方法都是默認的虛擬方法,除了final和private方法。無法爲多態行爲繼承的方法不是虛擬方法。

0

我們無法在子類中重寫的方法通常稱爲非虛擬方法。

在Java靜態,私有&默認情況下,最終方法是非虛擬的。其他方法默認是虛擬的。

相關問題