2011-08-21 59 views

回答

75

您訪問內部類與$

java.nio.channels.FileChannel$MapMode/READ_ONLY 
+27

不要忘記,如果您正在使用'import'函數或':import'關鍵字導入FileChannel,則還必須指定您正在導入'FileChannel $ MapMode' –

+1

謝謝@TerjeDahl。我認爲你應該編輯你的問題,包括這個,Hamza Yerlikaya。 – Joe

11

語法(FileChannel/MapMode)是簡化的,只適用於靜態字段和方法(場,你甚至可以省略括號)!此外,...表單適用於字段/方法,但不適用於嵌套/內部類!

對於JVM,內部類Outer.Inner只是一個名爲Outer$Inner的類(並且編譯器爲此創建了一個文件Outer$Inner.class)。 Java編譯器允許您通過Outer.Inner來引用它。您還可以定義一個名爲Outer$Inner的非內部類,編譯器允許您將其引用爲Outer$Inner。你不能在同一時間同時定義,但是,因爲這兩個將有Outer$Inner類名(命名爲Outer$Inner.class.class文件,因此這將是一個重複的類名!)

當使用反射 - 例如與Class.forName() - (通常引入一些動態性),您不能省略導入類的包名稱,您必須使用帶有$符號的真實類名稱而不是點。

Clojure可能採用相同的方法,所以如果該類在my.package中,即使您已經導入了外部類,您也需要使用my.package.Outer$Inner這種形式!爲了避免包的名稱,你可以明確地導入內部類my.package.Outer$Inner,然後把它稱爲Outer$Inner(其真正的類名!),但你不會只將其導入這個減少Inner

Inner沒有意義JVM,只是Java編譯器爲您提供了編譯時上下文的快捷方式(在運行時不可用於JVM和方法,如Class.forName!)...在Clojure中,您當然可以始終定義:(def Inner Outer$Inner) ...或(def Tom Outer$Inner)(def Harry Outer$Inner)或其他...如果你更喜歡那個。

+0

這可能是一個很好的解釋。謝謝。 – tutysara