寫在前面的話:讀書破萬卷,編碼若有神
--------------------------------------------------------------------
這篇博客主要來談談"Java標記接口"的相關知識,主要內容包括:java
1. 概述dom
2. Serializable編碼
3. Cloneablecode
4. RandomAccess對象
--------------------------------------------------------------------
一、概述 blog
Java中經常使用的三個標記接口分別是:RandomAccess、Cloneable、Serializable,在查看JDK源碼的時候,咱們會常常發現這些接口的存在,它們不包含任何的方法,可是卻普遍的存在,這種接口咱們稱之爲標記接口(Mark Interface),這些接口咱們不用實現任何的方法,它們的做用就是當某個類實現這個接口的時候,咱們就認爲這個類擁有了接口標記的某種功能。索引
二、Serializable 接口
java.io.Serializable這個接口是用來標記類是否支持序列化的,所謂的序列化就是將對象的各類信息轉換成能夠存儲或者傳輸的一種形式。若是一個類沒有實現該接口,卻被拿去序列化的了,那麼虛擬機就會拋出不支持序列化的異常。開發
三、Cloneable 源碼
Cloneable接口在深度拷貝的時候常常被用到,以下:
1 public interface Cloneable{ 2 }
它的做用是標記該對象是否擁有克隆的能力,可能這裏會感受有一點奇怪,咱們都知道java.lang.Object類中自己已經有了一個方法:
1 protected native Object clone() throws CloneNotSupportedException
按道理來講的話每個類都應該能夠運行clone方法纔對呀,爲何還須要這樣一個標記接口呢?這樣的好處是以接口的形式標記對象是否擁有某種能力。想想,若是不經過標記接口的形式,咱們在平時的開發中,會怎麼去實現呢? 通常來講都是經過增長變量或者設置枚舉來達到控制的效果,這樣或許能解決問題,可是每每不能從面向對象的角度來優雅的解決問題。想一想接口的做用是什麼?接口就是用來標記某個類擁有了哪些功能、特性,而標記接口則是在面向對象的角度來看,更高級的一種抽象:即便你擁有這個方法也不行,由於你沒有這個功能的標記接口,因此在調用clone方法的過程當中,若是對象沒有實現Cloneable接口,那麼虛擬機就會拋出一個CloneNotSupportedException異常。
四、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 }
----------------------------------------------------------------------------------------------------------------------------------------