java 标识接口_java 标识接口的作用

标识接口的作用

标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。

标接口在Java语言中有一些很著名的应用,例如我们常用的ArrayList类,它的类实现接口如下:

public class ArrayList extends AbstractList

implements List, RandomAccess, Cloneable, java.io.Serializable

{

仔细看 RandomAccess、RandomAccess、Serializable的接口可以看到,内部都是一些空接口,没有定义接口方法

public interfaceRandomAccess {

}public interfaceCloneable {

}public interfaceSerializable {

}

标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签。

打个比喻,不是很恰当。就像是一个人穿了件名牌衣服(实现了标识接口),别人一看他穿的衣服(标识接口)就知道他的品味、身份(特性)。

例子:

//这是一个标记接口,不含有任何方法

public interfaceDemoInterface {

}

//类 ClassA 实现了 DemoInterface 接口

public class ClassA implementsDemoInterface {privateString aa;publicString getAa() {returnaa;

}public voidsetAa(String aa) {this.aa =aa;

}

}

//类 ClassB 没有实现 DemoInterface 接口

public classClassB {privateString bb;publicString getBb() {returnbb;

}public voidsetBb(String bb) {this.bb =bb;

}

}

//利用 instanceof 判断 类的实例是否 持有标记接口的标签

public classMain {public static voidmain(String[] args) {

ClassA classA= newClassA();

ClassB classB= newClassB();if(classA instanceofDemoInterface){

System.out.println("类 ClassA 实现了接口 DemoInterface,可以进行其他操作");

}else{

System.out.println("类 ClassA 未实现接口 DemoInterface");

}if(classB instanceofDemoInterface){

System.out.println("类 ClassB 实现了接口 DemoInterface,可以进行其他操作");

}else{

System.out.println("类 ClassB 未实现接口 DemoInterface");

}

}

}

控制台输出:

类 ClassA 实现了接口 DemoInterface,可以进行其他操作

类 ClassB 未实现接口 DemoInterface

举一个jdk的例子:

以Serializable接口为例。一个类实现了这个接口,说明它可以被序列化。因此,我们实际上通过Serializable这个接口,给该类标记了“可被序列化”的元数据,打上了“可被序列化”的标签。这也是标记/标签接口名字的由来。

下面的代码是我从JDK源代码中摘出来的:

if (obj instanceofString) {

writeString((String) obj, unshared);

}else if(cl.isArray()) {

writeArray(obj, desc, unshared);

}else if (obj instanceofEnum) {

writeEnum((Enum) obj, desc, unshared);

}else if (obj instanceofSerializable) {

writeOrdinaryObject(obj, desc, unshared);

}else{if(extendedDebugInfo) {throw new NotSerializableException(cl.getName() + " "

+debugInfoStack.toString());

}else{throw newNotSerializableException(cl.getName());

}

}

Java里的序列化,字符串,数组,枚举类和普通类是分别进行的。如果当前待序列化的变量既不是字符串,也不是数组和枚举类,那么就检测该类是否实现了Serializable的接口,如果没有实现Serializable接口,就会抛出异常NotSerializableException。

大家也许会问,在Spring里满天飞的注解(Annotation)不是最好的用来维护元数据的方式么?确实,Annotation能声明在Java包、类、字段、方法、局部变量、方法参数等的前面用于维护元数据的目的,既灵活又方便。然而这么好的东西,只有在JDK1.5之后才能用。JDK1.5之前维护元数据的重任就落在标记接口上了。

大家看另一个标记接口,Cloneable。下图第51行清晰标注了该接口从JDK1.0起就有了。

805cf2f22c43224b49cff6f46dc51e40.png

JDK源代码里的Clone方法的注释也清晰注明了,如果一个类没有实现Cloneable接口,在执行clone方法时会抛出CloneNotSupportedException异常。

6cd7a2d5e44ad98e54ce70174a51289b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值