寫在前面的話:讀書破萬卷,編碼如有神
--------------------------------------------------------------------
這篇博客主要來談談"Java標記接口"的相關知識,主要內容包括:
1. 概述
2. Serializable
3. Cloneable
4. RandomAccess
--------------------------------------------------------------------
1、概述
Java中常用的三個標記接口分別是:RandomAccess、Cloneable、Serializable,在查看JDK源碼的時候,我們會經常發現這些接口的存在,它們不包含任何的方法,但是卻廣泛的存在,這種接口我們稱之為標記接口(Mark Interface),這些接口我們不用實現任何的方法,它們的作用就是當某個類實現這個接口的時候,我們就認為這個類擁有了接口標記的某種功能。
2、Serializable
java.io.Serializable這個接口是用來標記類是否支持序列化的,所謂的序列化就是將對象的各種信息轉換成可以存儲或者傳輸的一種形式。如果一個類沒有實現該接口,卻被拿去序列化的了,那么虛擬機就會拋出不支持序列化的異常。
3、Cloneable
Cloneable接口在深度拷貝的時候經常被用到,如下:
1 public interface Cloneable{ 2 }
它的作用是標記該對象是否擁有克隆的能力,可能這里會感覺有一點奇怪,我們都知道java.lang.Object類中本身已經有了一個方法:
1 protected native Object clone() throws CloneNotSupportedException
按道理來說的話每一個類都應該可以運行clone方法才對呀,為什么還需要這樣一個標記接口呢?這樣的好處是以接口的形式標記對象是否擁有某種能力。想一想,如果不通過標記接口的形式,我們在平時的開發中,會怎么去實現呢? 一般來說都是通過增加變量或者設置枚舉來達到控制的效果,這樣或許能解決問題,但是往往不能從面向對象的角度來優雅的解決問題。想想接口的作用是什么?接口就是用來標記某個類擁有了哪些功能、特性,而標記接口則是在面向對象的角度來看,更高級的一種抽象:即使你擁有這個方法也不行,因為你沒有這個功能的標記接口,所以在調用clone方法的過程中,如果對象沒有實現Cloneable接口,那么虛擬機就會拋出一個CloneNotSupportedException異常。
4、RandomAccess
1 public interface RandomAccess(){ 2 }
這個接口的作用是判斷集合是否能快速訪問,也就是通過索引下標能否快速的移動到對應的元素上。我們在使用某個集合類中,集合中的元素可以通過索引index下標快速的訪問到,那么在該類的定義處,一般會有一個RandomAccess接口的實現標簽
比如:java.util.ArrayList<E>有這個接口,java.util.LinkedList<E>就沒有
1 public class ArrayList<E> extends AbstractList<E> 2 implements List<E>, RandomAccess, Cloneable, java.io.Serializable 3 { 4 //... 5 }
1 public class LinkedList<E> 2 extends AbstractSequentialList<E> 3 implements List<E>, Deque<E>, Cloneable, java.io.Serializable 4 { 5 ... 6 }
--------------------------------------------------------------------
--------------------------------------------------------------------