标识接口的作用

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

 标接口在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 DemoInterface { }
// 类 ClassA 实现了 DemoInterface 接口
public class ClassA implements DemoInterface { private String aa; public String getAa() {
return aa;
}
public void setAa(String aa) {
this.aa = aa;
}
}
// 类 ClassB 没有实现 DemoInterface 接口
public class ClassB { private String bb; public String getBb() {
return bb;
}
public void setBb(String bb) {
this.bb = bb;
}
}
// 利用 instanceof 判断 类的实例是否 持有标记接口的标签
public class Main {
public static void main(String[] args) {
ClassA classA = new ClassA();
ClassB classB = new ClassB(); if(classA instanceof DemoInterface){
System.out.println("类 ClassA 实现了接口 DemoInterface,可以进行其他操作");
}else{
System.out.println("类 ClassA 未实现接口 DemoInterface");
} if(classB instanceof DemoInterface){
System.out.println("类 ClassB 实现了接口 DemoInterface,可以进行其他操作");
}else{
System.out.println("类 ClassB 未实现接口 DemoInterface");
}
}
}

控制台输出:

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

  类 ClassB 未实现接口 DemoInterface

举一个jdk的例子:

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

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

if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(cl.getName() + " "
+ debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}

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

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

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

java 标识接口的作用的更多相关文章

  1. Java序列化接口的作用总结

    一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了. ...

  2. java标识接口

    标识接口是没有任何方法和属性的接口,标识接口不对实现类有任何语义上的要求,仅仅表明它的实现类属于一个特定的类型.它非常类似于Web 2.0中的TAG的概念,Java使用它标识某一类对象.主要有两个用途 ...

  3. Java中接口的作用

    转载于:https://www.zhihu.com/question/20111251 困惑:例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂 ...

  4. Java序列化接口的作用总结1

    一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了. ...

  5. Java 的标识接口作用

    原文地址:标识接口 作用作者:feisong 时间:2019-01-2315:49:35 标识接口是没有任何方法和属性的接口.标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定 ...

  6. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  7. Java序列化接口Serializable接口的作用总结

    一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字 ...

  8. OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)

    Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...

  9. 为什么这些java接口没有抽象方法?浅谈Java标记接口

    在jdk的源码中,存在这样的一些接口,他们不包含任何的(抽象)方法,但是却广泛的存在. 这种接口我们称之为Mark Interface,也就是标记接口. 这些接口呢,我们不用来实现任何的方法,他们的作 ...

随机推荐

  1. Spring Boot日志处理

    2.4 日志处理 2.4.1 记录日志内容 请求url 访问者ip 调用方法classMethod 参数args 返回内容 2.4.2 新建包aspect,新建日志切面处理类 package com. ...

  2. window.open()的实际应用

    Window open() 方法 定义和用法 open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口. 语法 window.open(URL,name,specs,replace) 参数 ...

  3. 使用logrotate轮询nginx和apache日志

    使用logrotate轮询nginx和apache日志     文章目录 [隐藏] 配置nginx 配置apache 使用logrotate轮询日志很方便,配置也很简单. 配置nginx 1.建立/e ...

  4. 虚拟机安装Windows系统,再安装orcale

    本文出自:http://www.cnblogs.com/2186009311CFF/p/8724441.html 1.创建新虚拟机 2.选择自定义 3.选择workstation 5.x(据安装的系统 ...

  5. AOP代理

  6. springboot + 注解 + 拦截器 + JWT 实现角色权限控制

    1.关于JWT,参考: (1)10分钟了解JSON Web令牌(JWT) (2)认识JWT (3)基于jwt的token验证 2.JWT的JAVA实现 Java中对JWT的支持可以考虑使用JJWT开源 ...

  7. Apache主要配置文件http.conf

    1.基本概念 Define SRVROOT "/Apache24" ServerRoot "${SRVROOT}" #Apache安装的根路径 #Listen ...

  8. Java——网络

    [通信协议分层]   (1)为什么要分层?  

  9. 解决报错(Could not create connection to database server.)

    org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory 尝试多种方法后发现是由于mysq ...

  10. Leetcode 15. Sum(二分或者暴力或者哈希都可以)

    15. 3Sum Medium Given an array nums of n integers, are there elements a, b, c in nums such that a +  ...