Java标记接口

1.概述
Java中常用的三个标记接口分别是:RandomAccess、Cloneable、Serializable,在查看JDK源码的时候,我们会经常发现这些接口的存在,它们不包含任何的方法,但是却广泛的存在,这种接口我们称之为标记接口(Mark Interface),这些接口我们不用实现任何的方法,它们的作用就是当某个类实现这个接口的时候,我们就认为这个类拥有了接口标记的某种功能。

2.Serializable
java.io.Serializable这个接口是用来标记类是否支持序列化的,所谓的序列化就是将对象的各种信息转换成可以存储或者传输的一种形式。如果一个类没有实现该接口,却被拿去序列化的了,那么虚拟机就会抛出不支持序列化的异常。

3.Cloneable
Cloneable接口在深度拷贝的时候经常被用到,如下:

 public interface Cloneable{
 }

它的作用是标记该对象是否拥有克隆的能力,可能这里会感觉有一点奇怪,我们都知道java.lang.Object类中本身已经有了一个方法:

 protected native Object clone()  throws CloneNotSupportedException

按道理来说的话每一个类都应该可以运行clone方法才对呀,为什么还需要这样一个标记接口呢?这样的好处是以接口的形式标记对象是否拥有某种能力。想一想,如果不通过标记接口的形式,我们在平时的开发中,会怎么去实现呢? 一般来说都是通过增加变量或者设置枚举来达到控制的效果,这样或许能解决问题,但是往往不能从面向对象的角度来优雅的解决问题。想想接口的作用是什么?接口就是用来标记某个类拥有了哪些功能、特性,而标记接口则是在面向对象的角度来看,更高级的一种抽象:即使你拥有这个方法也不行,因为你没有这个功能的标记接口,所以在调用clone方法的过程中,如果对象没有实现Cloneable接口,那么虚拟机就会抛出一个CloneNotSupportedException异常。

4.RandomAccess

public interface RandomAccess(){
}

这个接口的作用是判断集合是否能快速访问,也就是通过索引下标能否快速的移动到对应的元素上。我们在使用某个集合类中,集合中的元素可以通过索引index下标快速的访问到,那么在该类的定义处,一般会有一个RandomAccess接口的实现标签

比如:java.util.ArrayList有这个接口,java.util.LinkedList就没有

public class ArrayList<E> extends AbstractList<E>
         implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
 //... }
public class LinkedList<E>
     extends AbstractSequentialList<E>
     implements List<E>, Deque<E>, Cloneable, java.io.Serializable {
     ...
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,使用一个接口来给一个类打上某种标记接口被称为标记接口(Marker Interface),也称为标识接口标记接口是一种非常简单但又非常有用的技术,它允许程序员在不增加任何方法的情况下,为某个类或对象打上标记,以便在程序运行时识别出它们的特定属性或行为。 标记接口没有任何方法定义,它只是一个空接口,例如: ```java public interface MyMarkerInterface { // 这个接口没有任何方法定义 } ``` 在程序中使用标记接口时,只需要让需要被标记的类实现这个接口即可,例如: ```java public class MyClass implements MyMarkerInterface { // MyClass 实现了 MyMarkerInterface 接口 } ``` 在程序中,可以通过 instanceof 关键字来判断某个对象是否实现了某个标记接口,例如: ```java if (myObject instanceof MyMarkerInterface) { // myObject 实现了 MyMarkerInterface 接口 } ``` 标记接口的主要作用是为了让程序员在运行时识别出某个类或对象的特定属性或行为,它通常用于以下几种情况: 1. 序列化:Java 中的序列化机制要求被序列化的类必须实现 java.io.Serializable 接口,这个接口就是一个标记接口,它没有任何方法,只是用来标记一个类可以被序列化。 2. 标识某个对象的属性:例如,java.rmi.Remote 接口就是一个标记接口,它用来标识某个对象是可远程调用的。 3. 简化代码:标记接口可以作为一种简化代码的方式,用来代替标记类。例如,可以定义一个 EmptyMarker 接口,用来标记某些对象为空,而不是定义一个专门的 EmptyMarker 类。 需要注意的是,标记接口虽然没有任何方法定义,但是它的存在本身就有一定的意义,因此在定义标记接口时需要仔细考虑其含义和用途,避免滥用标记接口造成代码混乱。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值