一文搞懂标识接口/空接口和标记注解

本文介绍了标识接口和标记注解的基本概念及其在Java中的应用。标识接口是一种不含方法和属性的接口,用于标记实现该接口的类。标记注解则是JDK1.5引入的一种元数据维护方式。文章通过具体示例比较了两者之间的相似性和不同之处。

标识接口和标记注解本质意义一样,只是因为JDK一开始没有注解(JDK1.5才有)这个概念,所以才有了标识接口,现在一般通过注解实现标识!

基本概念

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

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

控制台输出:

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

JDK源码实现

以Serializable为例:

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法进行序列化或反序列化。 可序列化类的所有子类型本身都是可序列化的。

查阅Serializable的源码,就会发现,他只是一个空的接口,里面什么东西都没有。Serializable接口没有方法或字段,仅用于标识可序列化的语义。 但是,如果一个类没有实现这个接口,想要被序列化的话,就会抛出java.io.NotSerializableException异常。

Serializable是在执行序列化的过程中,会执行到以下代码:

if (obj instanceof String) {
   
   
    writeString((String) obj, unshared);
} else if 
### 微型计算机原理接口技术入门教程概述 #### 一、微型计算机系统组成及其工作原理 微型计算机由硬件软件两大部分构成。硬件主要包括中央处理单元(CPU)、存储器(内存储器RAM外存储器ROM)、输入设备、输出设备以及连接这些部件的总线系统[^1]。 #### 二、80x86系列微处理器架构发展历程 早期基于Intel公司的8086 CPU构建起的标准PC平台逐渐演变为现代个人电脑的基础框架;随着技术进步,后续出现了性能更强且功能更丰富的型号如Pentium系列直至如今广泛使用的酷睿(Core)i3/i5/i7等产品线。每一代新推出的处理器都会带来新的特性改进,在保持向下兼容的同时增加了更多高级特性优化措施来满足日益增长的应用需求[^2]。 #### 三、汇编语言程序设计基础 对于初学者而言,学习如何编写简单的汇编代码是非常重要的一步。这不仅有助于理解机器是如何执行命令序列从而完成特定任务的过程,而且还能加深对底层硬件机制的认识。例如,通过定义数据段(.data section), 文本段 (.text section),并利用MOV指令实现两个寄存器之间的数值传递操作: ```assembly section .data num db 10 ; 定义一个字节大小的数据变量num, 初始值为10 section .bss result resd 1 ; 预留四个字节的空间给result变量用于保存计算结果 section .text global _start _start: mov eax, [num] ; 将[num]中的值加载到eax寄存器里 add eax, 5 ; 对eax里的值加5 mov [result], eax ; 把更新后的eax值写入[result] ``` 上述例子展示了最基础级别的汇编编程概念——即直接操控CPU内部资源以达到预期目的的方法之一。 #### 四、存储器接口设计要点 为了使CPU能够有效地访问外部世界的信息源或目标位置,必须建立合理的通信桥梁—这就是所谓的“接口”。当涉及到内存读取/写入动作时,则需特别关注地址映射关系的确立方式、寻址范围设定原则等问题。比如,在实际应用环境中可能遇到如下场景:假设有一个位于物理地址空间偏移量为`0x4000`处的I/O端口需要被周期性查询其状态变化情况,那么可以采用轮询法(Polling Method): ```c #define PORT_ADDRESS 0x4000 // 设定端口号常量宏定义 while (true){ unsigned char status = inb(PORT_ADDRESS); // 使用inb函数获取指定端口的状态信息 if(status & FLAG){ // 如果status中某一位标志位有效则触发相应事件处理逻辑... handle_event(); } } ``` 这段伪代码片段体现了程序员怎样借助于专门针对I/O操作而设立的功能库去简化复杂度较高的交互流程的设计思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apple_Web

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值