标识接口的用法

标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。
标接口在Java语言中有一些很著名的应用,比如java.io.Serializable和java.rmi.Remote等接口便是标识接口。标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签

为此,我们通过一个通俗而有趣的示例!这个示例是设计一个猎人,其持有一把智能,这就是说这把会自动识别人类,若发现瞄准的目标是人类,就不会开火,而其它的任何事物都通杀。
  为此,我们使用了下面三个接口:
  一个用来表示万事万物的SomeThing
    
  public
interface SomeThing {}  

  人类的接口:
  public interface Humans extendsSomeThing
{}


<wbr></wbr>

  动物的接口:
public interface Animals extendsSomeThing
{}


<wbr></wbr>

然后是一系列的实现:
<wbr><wbr><strong>中国人:</strong><wbr><wbr><wbr><wbr><wbr><br> public<br> class Chinese implements Humans {}<br><br><wbr><wbr><strong>日本人:</strong><br> public<br> class Japanese {}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>


<wbr></wbr>

<wbr><wbr><strong>狗:<br></strong>public class Dog implements Animals {}</wbr></wbr>


<wbr></wbr>

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


<wbr></wbr>

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


<wbr></wbr>

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


<wbr></wbr>

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


<wbr></wbr>

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


<wbr></wbr>

   由此可见,空接口(标签接口)的重要性,在像本例中,给不给自己帖上标签,这是一个性命莜关的问题。其实在OO的世界中,空接口可以算是最高的层像。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值