写在前面的话:读书破万卷,编码若有神
--------------------------------------------------------------------
这篇博客主要来谈谈"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 }
----------------------------------------------------------------------------------------------------------------------------------------