2015-05-02 27 views
1

我知道'標記界面',標記界面沒有任何成員。例如:Serialiazable,Cloneable標記界面的內部實現是什麼?

我發現在谷歌搜索標記接口是發送一些指令給JVM嗎? I want to know what are those instructions以及我如何理解?請幫助我一個真實世界的例子。

+1

看看這個「[* Java *中的標記接口](http://stackoverflow.com/q/9858708/1364007)」。 –

回答

2

標記接口是一種標記類是或有些事情的方法,甚至這些事情都不表示爲實際方法。例如SerialiazableCloneable等。此外,由於註釋介紹,他們幾乎總是首選,雖然他們不能完全替代標記接口,由Joshua布洛赫

的建議......你可能會聽到有人說,標記說明(項目35 )使標記 接口過時。這個斷言是不正確的。標記接口 與標記註釋相比具有兩個優點。首先, 標記接口定義了一個類型,該類型由標記類的實例 實現;標記註釋不。這種 類型的存在,使得你能夠在你不能 捕捉到,如果你使用的標記註釋運行....

Serializable情況下,一個類實現此接口,以編譯時錯誤表明其非瞬態數據成員可以寫入ObjectOutputStream。另外,序列化對象需要保持系統間的兼容性,這是一個明確的設計決定,因此需要使用標記接口來識別這些候選。

類似的實現Cloneable告訴JVM該類實現了Cloneable,因此JVM將不得不按位拷貝它。

+0

最後一句話是非常滑稽地表達。 '實現'Cloneable'告訴JVM這個類實現'Cloneable''只是一個同義反復。 – EJP

1

在google搜索中發現標記界面用於向JVM發送一些指令?

不可以。它們被用作其他Java代碼的標記。

我想知道那些是什麼指令

這是一個instanceof測試沒有什麼更奇特。

1

標記接口沒有實現。

但是,標記接口通常會影響一些其他類的行爲。

我發現在Google上用標記界面發送一些指令給JVM嗎?

這是不正確的。

它正在做的是向JVM或由JVM提供或運行的類提供信息。該信息不是「說明」的形式。而是它在課堂上的標籤。

例如,當您聲明一個類爲Serializable時,您將信息傳遞給ObjectInputStreamObjectOutputStream該類的實例可以被序列化。你正在以課堂本身的形式傳遞這些信息;即ObjectInputStreamObjectOutputStream可以使用instanceof(或等價物)來測試對象是否可序列化。

請幫助我一個現實世界的例子。

可序列化和可複製是Java類庫中衆所周知的例子。

還有其他接口具有「標記接口」方面。例如,CloseableAutocloseable都有一個單一的close()方法可以做同樣的事情。區別在於AutoCloseable被「try with resources」語句視爲標記。

最後,標記界面被OO設計純粹主義者所詬病是沒有價值的。您可以使用Java註釋實現相同的目標。