Java标识接口的使用方法

作者:laozhang 时间:2021-12-24 02:54:14 

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

标接口在Java语言中有一些很著名的应用,比如java.io.Serializable和java.rmi.Remote等接口便是标识接口。标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签。

为此,我们通过一个通俗而有趣的示例!这个示例是设计一个猎人,其持有一把智能猎枪,这就是说这把猎枪会自动识别人类,若发现瞄准的目标是人类,就不会开火,而其它的任何事物都通杀。

为此,我们使用了下面三个接口:

一个用来表示万事万物的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的世界中,空接口可以算是最高的层像。

标签:Java,标识接口
0
投稿

猜你喜欢

  • Android Studio的安装及第一次启动时的配置问题

    2021-12-23 08:29:27
  • C# 语言入门基础介绍

    2022-03-02 13:32:33
  • unity实现玻璃效果

    2023-03-17 07:08:28
  • Spring IOC与DI核心重点分析

    2023-11-12 14:35:55
  • 深入学习Java 热部署的知识

    2023-10-16 18:23:24
  • Android自定义attr的各种坑

    2023-07-12 06:11:50
  • C#四舍五入(函数)用法实例

    2022-02-03 21:51:16
  • Android NDK开发(C语言字符串)

    2023-06-18 10:21:28
  • Android开发中多进程共享数据简析

    2023-10-10 05:17:04
  • springboot max-http-header-size最大长度的那些事及JVM调优方式

    2021-12-14 03:43:46
  • 通过IDEA快速定位和排除依赖冲突问题

    2021-06-07 02:01:16
  • Android中URLEncoder空格被转码为"+"号的处理办法

    2022-02-09 17:58:12
  • C#创建WebService接口并连接的全过程

    2023-04-07 07:47:21
  • java 读写文件[多种方法]

    2022-10-04 09:09:00
  • 使用controller传boolean形式值

    2023-11-28 23:05:33
  • c#分页读取GB文本文件实例

    2021-09-13 10:18:39
  • SpringCloud微服务熔断器Hystrix使用详解

    2023-07-06 22:57:46
  • c++回调之利用函数指针示例

    2022-07-26 06:59:32
  • Android ListView与RecycleView的对比使用解析

    2022-05-05 16:56:02
  • 获取Java线程转储的常用方法(推荐)

    2023-05-15 02:30:19
  • asp之家 软件编程 m.aspxhome.com