zoukankan      html  css  js  c++  java
  • java 标识接口的作用

    标识接口的作用

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

     标接口在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异常。

     

  • 相关阅读:
    【流量劫持】SSLStrip 终极版 —— location 瞒天过海
    【流量劫持】沉默中的狂怒 —— Cookie 大喷发
    【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
    Web 前端攻防(2014版)
    流量劫持 —— 浮层登录框的隐患
    流量劫持能有多大危害?
    流量劫持是如何产生的?
    XSS 前端防火墙 —— 整装待发
    XSS 前端防火墙 —— 天衣无缝的防护
    XSS 前端防火墙 —— 无懈可击的钩子
  • 原文地址:https://www.cnblogs.com/myseries/p/10876314.html
Copyright © 2011-2022 走看看