2014-02-10 94 views
5

我讀過繼承是一種「編譯時間」現象,在另一個地方,我讀過超類代碼是由類加載器加載的,我推測這是在運行時發生的。我對繼承的性質有些困惑,子類的類文件是否包含超類的實際編譯代碼,還是在運行時訪問?Java中的子類編譯

+0

「我已閱讀。 ..「:你能提供一個參考嗎? –

+0

http://www.cs.utexas.edu/users/lavender/courses/tutorial/java-06.pdf –

+0

我可以看到爲什麼會增加你的困惑。正如其他答案指出的那樣,繼承在編譯時和運行時都很重要。那句話是錯的。 –

回答

4

因此,考慮您創建一個類,該類繼承了包含在第三方jar文件

爲了編譯你的代碼,你需要在編譯器的類路徑中有第三方jar文件。

爲了運行您的代碼,您還需要啓動應用程序的java命令的類路徑中的jar文件。

你的子類不包含超類的代碼,它在jar文件中。您編譯的類包含對超類的引用。當你的類被類加載器加載時,它會在超類的類路徑中搜索並加載它。

+2

我認爲你的回答可能會更好地解決他的困惑,但我認爲他正在徘徊於一個既不是或者命題的想法,也不是。它是兩個。它在編譯時需要被編譯,並且在運行時需要被加載和鏈接。 – lscoughlin

+0

@lscoughlin同意。我不認爲像編譯時或運行時這樣的語言概念。 – mikea

+0

感謝你和@Iscoughlin,這清除了我的懷疑... @ Iscoughlin是正確的,我想知道它的一個或者是一個命題,你的評論是否能夠清除空氣。 –

1

你在哪裏閱讀過它的編譯時間?我猜如果你編譯你的子類,那麼是的,它需要有一個超類來編譯時參考。

但是當你真正運行是動態鏈接按代碼:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

「Java虛擬機動態加載,鏈接和初始化類和接口」

+0

http://www.cs.utexas.edu/users/lavender/courses/tutorial/java-06.pdf我在第一行的PDF文件中閱讀它。這增加了我的困惑。 –