`

标识接口的作用

阅读更多
标识接口就是空方法的接口,与其他接口的区别是:这个接口里面什么方法都没有,只是标记而已。例如serilizeabled就是这样一个接口,他只是告诉jvm,继承于这个接口的CLASS需要序列化处理,而我们根本不用实现这个接口的方法


标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。
标接口在Java语言中有一些很著名的应用,比如java.io.Serializable和java.rmi.Remote等接口便是标识接口。标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签。
打个比喻,不是很恰当。就像是一个人穿了件名牌衣服(实现了标识接口),别人一看他穿的衣服(标识接口)就知道他的品味、身份(特性)。

下面是一个示例:

这是昨天我跟天意在一次闲聊中一次有起的讨论,标签接口真有那么重要吗?比如说很多初学者认为java.io.Serializable这样的接口,很多时候可用可不用,不用一样能执行对象系列化功能。
  为此,我们通过一个通俗而有趣的示例!这个示例是设计一个猎人,其持有一把智能猎*,这就是说这把猎*会自动识别人类,若发现瞄准的目标是人类,就不会开火,而其它的任何事物都通杀。
  为此,我们使用了下面三个接口:
  一个用来表示万事万物的SomeThing
    
  public interface SomeThing {}  
  人类的接口:
  public interface Humans extends SomeThing {}

  动物的接口:
public interface Animals extends SomeThing {}

然后是一系列的实现:
   中国人:     
public class Chinese implements Humans {}

   日本人:
public class Japanese {}

   狗:
public class Dog implements Animals {}

妖怪(他很聪明,给自己帖上了人的标签):
public class Monster implements Humans {}

下面这个程序的核心部分,猎人类及客户端程序:
public class Hunter {
public void fire(Object target)
{
if(target instanceof Humans)
{
  System.out.println("这下完了,打中了一个人,该去坐牢了!");
}
else
{
  System.out.println("恭喜你,打中了一只动物!");
}
}
//智能的枪
public void intelligentFire(Object target)
{
if(target instanceof Humans)
{
  return;
}
System.out.println("开了一枪!"+target.getClass());
//下面进行秒杀等相关处理
//销毁他
target=null;
}
public static void main(String[] args) {
Hunter hunter=new Hunter();
Object[] objects=new Object[]{new Dog(),new Japanese(),new Japanese(),new Chinese(),new Monster(),new SomeThing(){}};
for(int i=0;i<objects.length;i++)
hunter.intelligentFire(objects[i]);
}
}

运行程序,你会发现输出类似下面结果:

开了一枪!class springroad.demo.taginterface.Dog
开了一枪!class springroad.demo.taginterface.Japanese
开了一枪!class springroad.demo.taginterface.Japanese
开了一枪!class springroad.demo.taginterface.Hunter$1

  由此可见,智能猎*瞄准6个目标,开了4枪。只对Chinese、及Monster的实例没有开枪。因为这里讨论的是标签接口,虽然Humans没有任何方法,但从智能猎*的角度来看,他就是通过这个标签来判断是否可以开火的。他不用管也管不了目标的层次等级关系(比如Japanese肯定很非常鲜明等级结构),即继承关系。他也管不了目标的来自于哪儿。比如,是用new操作符创建,还是从容器中取,或者是从网络某个地方加载一个。
  Hunter只是制订了一个简单的规则,你要想不让我的*对你开火,你就必须在自己身上帖上一个Humans的标签。也就是说你必须遵守这个规则。
  现在回过头来看,因为妖怪Monster真身应该是一条蛇或其它什么动物,但是他懂得Hunter制订的规则,于在巧妙的给自己帖上了一个Humans的标签,以致于欺骗了我们的智能猎*。
  而Japanese则自认为自己了不起,不按规则办事,我就不理你Hunter制订的规则,什么Humans标签,我就是不用。于是放到我们的程序中当然就只有挨杀的份了。

  由此可见,空接口(标签接口)的重要性,在像本例中,给不给自己帖上标签,这是一个性命莜关的问题。其实在OO的世界中,空接口可以算是最高的层像。


分享到:
评论

相关推荐

    计算机常见外部接口图解

    计算机常见外部接口图解,教你识别计算机的各类接口,并对各个接口的作用进行了详细说明

    神州数码路由器接口简介.pdf

    三、 实验设备 1、DCR 1702 一台 四、 实验拓扑 五、 实验要求 1、 以太网接口有 100M 和 10M 之分 2、 注意观察接口和模块上的标志 3、 注意插槽上标号,从靠近电源开始,依次是 0、1、2、3 4、 各接口也从 0 开始...

    精通WindowsAPI 函数 接口 编程实例

    17.1.1 访问令牌、权限和用户标识 506 17.1.2 进程的系统操作权限 507 17.1.3 安全对象 508 17.1.4 访问控制列表(ACL) 508 17.2 安全机制程序示例 509 17.2.1 列举进程访问令牌内容和权限 509 17.2.2 ...

    精通Windows.API-函数、接口、编程实例.pdf

    17.1.1 访问令牌、权限和用户标识 506 17.1.2 进程的系统操作权限 507 17.1.3 安全对象 508 17.1.4 访问控制列表(ACL) 508 17.2 安全机制程序示例 509 17.2.1 列举进程访问令牌内容和权限 509 17.2.2 ...

    语音扩展标记语言VoiceXML接口规范

    5.3.2.1 语音合成标志语言 44 5.3.2.2 基本语音输出 44 5.3.2.3 播放语音文件 44 5.3.2.4 VALUE元素 45 5.3.2.5 打断语音输出 45 5.3.2.6 超时 46 5.3.3 环境与资源 46 5.3.3.1 资源 46 5.3.3.1.1资源获取 46 5.3....

    电路板设计中各层的定义以及作用

    电路板设计中各层的定义以及作用,详细介绍了电路板中定义,AltiumDesigner绘制PCB图纸,包含信号层,丝印层,内部电源层,机械层、禁止布线层,多层等

    JAVA细节知识

    java 类 对象引用 对象 ...还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

    java面试宝典

    243、remote接口和home接口主要作用 56 244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需...

    微机接口试卷样张1

    1. 工具栏 1. (4 分)简述 MCS-51 程序状态字 PSW 中 4 个常用标志的名称与作用 1. (6 分)设 A=19H,B=81H,执行下述指令,

    VC++ COM组件开发相关实例

    5.1 每个接口都具有唯一标识 GUID 5.2 实现接口查询函数 QueryInterface 6 IUnknown 接口 6.1 IUnknown是微软定义的标准接口 我们实现所有接口就是继承这个接口 6.2 IUnknown定义了三个函数 ...

    微机接口与技术习题微型计算机原理与应用练习

    很全的习题材料微型计算机原理与应用练习 第二章 微型计算机的基本结构 一、问答题: 1、 微型计算机是由哪几部分组成的?各部分的功能是什么? 2、 IBM PC机的主存有哪几...6、下列各情况影响哪些标志位?其值是什么?

Global site tag (gtag.js) - Google Analytics