2012-12-28 52 views
6

在Java中,導入與(外部)類相關,因爲每個(外部)類都應該用單獨的文件編碼。因此,可以聲稱類定義之前的import ...;指令與類關聯(有點像註釋)。爲什麼Java編譯器不支持繼承導入?

現在,如果可以繼承一個父類的導入,這將大大減少源文件的混亂。爲什麼這不可能?即爲什麼Java編譯器不應該考慮基類的導入?

注:

  • 很可能有不止一個答案。
  • 我知道,如果你讓eclipse組織你的導入,那麼不需要提及這個問題。這是關於'爲什麼',而不是'如何'(a-la-this)。而是每公衆,頂級類必須是 -
+0

您可以在一個文件中聲明多個類。導入與文件相關,而不是類。 – MrSmith42

+2

如果父類導入'java.lang.annotation.Annotation'並且想要使用java.text.Annotation'的子類,該怎麼辦?如果導入是繼承的,這將會變得複雜。 – jlordo

+0

我讓我的IDE管理所有導入並將它們摺疊起來,所以我甚至不會看到它們。我發現我不必經常考慮它們。 –

回答

10

首先,需要注意的是並非每個類都必須在一個單獨的文件進行編碼是很重要的。不,導入並不真正與任何類關聯 - 它們只是用於在文件中包含某些外部類/包的語句,以便可以使用它們。事實上,你永遠需要實際輸入任何東西,你總是可以用全稱,即:

java.util.List<String> list = new java.util.ArrayList<String>(); 

進口在那裏爲方便(並只用於編譯 - 類編譯後,他們都將丟失)以免讓您不必寫出所有內容,而只會讓您編寫List<String> list = new ArrayList<String>(在從java.util進行相關導入之後)。因此,沒有理由爲什麼子類應該「繼承」進口。

+1

+1每個公共,頂級課程都必須在它自己的文件中。公共嵌套類可以共享一個文件。 –

+3

+1,我認爲明確聲明只有編譯器存在導入是很重要的(或者爲了便於閱讀以避免完全限定名稱 - 無論您選擇哪個原因)。在課程編寫完成之後,他們會迷失方向。 – cklab

+0

謝謝,做出了澄清。 – arshajii

2

進口是語法糖,僅此而已。如果你真的想,你可以編寫任何Java程序而不需要使用導入語句。例如,下面的類編譯所有的本身:

class Foo { 
    java.util.List<String> list = new java.util.ArrayList<String>(); 
} 

此外,繼承進口使它很多,很多更難從類中刪除導入。例如,如果Bar.java繼承自Foo.java,則可能無法從Foo刪除導入而不將其添加到Bar。強制導入是顯式的,這使得更改單個文件變得非常容易,而不用擔心其他文件的影響,這幾乎是Java和麪向對象編程的基本原則。

(最後這一點是與那名a significant factor in the design of Go問題,它是專門試圖避免在這一領域的C和C++的問題。)

+0

所以,你是說從Foo中刪除導入將需要重新編譯Bar,否則可能會失敗。但是,爲什麼這是一個問題?讓我們失敗,讓Bar的作者自己進口。這是他/他今天需要做的事情,對吧? – einpoklum

+0

在你提出的場景中,Foo進口Baz,Bar進口Foo,但也需要Baz。如果Foo想要刪除Baz導入,那麼Bar突然不再從Foo獲得Baz,並且必須重寫,而不僅僅是重新編譯。那就是問題所在。 –

+0

這是怎麼回事?假設Bar從Foo繼承了一個方法,並且從Foo中移除了moethod。這也需要重寫。與Faz繼承巴茲一樣的東西。一旦你將進口與班級聯繫起來,這就變得合理了。恕我直言。 – einpoklum

1

有每個文件明確指定的進口提高了可讀性。想象一下打開一個文件,一眼就看不到依賴關係,因爲導入是從另一個文件繼承的。

+0

我不需要想象它,我在現實生活中有這樣的想法:在大多數其他語言中,您「導入」自己「導入」其他內容的事物,例如,包含C和C++文件。 – einpoklum

+0

...並有70個進口並不是真正的可讀性勝利(除非你是編譯器當然)。 – einpoklum