标识接口和标记注解本质意义一样,只是因为JDK一开始没有注解(JDK1.5才有)这个概念,所以才有了标识接口,现在一般通过注解实现标识!
基本概念
标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。
标识接口在Java语言中有一些很著名的应用,例如我们常用的ArrayList类,它的类实现接口如下:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
仔细看 RandomAccess、RandomAccess、Serializable的接口可以看到,内部都是一些空接口,没有定义接口方法
public interface RandomAccess {
}
public interface Cloneable {
}
public interface Serializable {
}
标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签。
自定义标识接口
// 这是一个标记接口,不含有任何方法
public interface MyMark {
}
// 类 ClassA 实现了 MyMark 接口
public class ClassA implements MyMark {
private String aa;
}
// 类 ClassB 没有实现 MyMark 接口
public class ClassB {
private String bb;
}
// 利用 instanceof 判断 类的实例是否 持有标记接口的标签
public class MyTest {
public static void main(String[] args) {
ClassA classA = new ClassA();
ClassB classB = new ClassB();
if(classA instanceof MyMark){
System.out.println("类 ClassA 实现了接口 MyMark,可以进行其他操作");
}else{
System.out.println("类 ClassA 未实现接口 MyMark");
}
if(classB instanceof MyMark){
System.out.println("类 ClassB 实现了接口 MyMark,可以进行其他操作");
}else{
System.out.println("类 ClassB 未实现接口 MyMark");
}
}
}
控制台输出:
类 ClassA 实现了接口 MyMark,可以进行其他操作
类 ClassB 未实现接口 MyMark
JDK源码实现
以Serializable为例:
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法进行序列化或反序列化。 可序列化类的所有子类型本身都是可序列化的。
查阅Serializable的源码,就会发现,他只是一个空的接口,里面什么东西都没有。Serializable接口没有方法或字段,仅用于标识可序列化的语义。 但是,如果一个类没有实现这个接口,想要被序列化的话,就会抛出java.io.NotSerializableException异常。
Serializable是在执行序列化的过程中,会执行到以下代码:
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if

本文介绍了标识接口和标记注解的基本概念及其在Java中的应用。标识接口是一种不含方法和属性的接口,用于标记实现该接口的类。标记注解则是JDK1.5引入的一种元数据维护方式。文章通过具体示例比较了两者之间的相似性和不同之处。
最低0.47元/天 解锁文章
1066

被折叠的 条评论
为什么被折叠?



