惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
D
Docker
IT之家
IT之家
博客园_首页
罗磊的独立博客
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
美团技术团队
Y
Y Combinator Blog
博客园 - 聂微东
量子位
阮一峰的网络日志
阮一峰的网络日志
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
Martin Fowler
Martin Fowler
Jina AI
Jina AI
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
月光博客
月光博客
G
Google Developers Blog
B
Blog
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿

博客园 - 进击的程序员

cuowu Angular4+路由 由href return false 来看阻止默认事件 TypeScript的配置文件 tsconfig.json 动手编写TCP服务器系列之一:日志文件 Shell语言系列之一:文件处理 给Amazon ec2 增加卷(Volume)并挂载到系统 Java打包问题之一:打包出现java.io.IOException: invalid header field struct中长度为0的数组用途与原理 面试题之堆栈队列系列一:设计包含min函数的栈 awk处理之案例六:awk根据条件插入文本 程序员的数学之余数:星期数的思考 面试题之实现系统函数系列一:实现memmove函数 awk处理之案例五:awk匹配字段2包含字段1的文本 awk处理之案例四:sort加awk来过滤文本 字符串面试题系列之七:字符串全排列 awk处理之案例三:awk去掉不需要的文本行 awk处理之案例二:awk匹配文本 awk处理之案例一:awk 处理百分比的问题
Java标记接口
进击的程序员 · 2018-04-13 · via 博客园 - 进击的程序员

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

--------------------------------------------------------------------

--------------------------------------------------------------------