Java 中的标记接口或带标签接口是什么?
本文将帮助您了解 Java 中的标记接口或带标签接口是什么。在了解标记接口之前,让我们回顾一下接口。
接口
与对象类似,接口是类的蓝图。它包含静态常量和抽象方法。它是 Java 中实现抽象和多重继承的一种机制。它使用 interface 关键字声明。它提供完全抽象,这意味着接口中的所有方法都必须声明为空体,并且所有字段默认情况下都必须是 public、static 和 final。
语法
interface <interface_name>{ // constant fields declaration // abstract methods declaration // by default }
标记接口
没有方法、字段和常量的接口称为标记接口或带标签接口。这种类型的接口是一个空接口。它提供有关对象运行时信息。此信息传递给 JVM 和编译器。可序列化和可克隆接口是标记接口的两个示例。
语法
interface Serializable { }
标记接口的用途
标记接口通过消息通知 Java 编译器,以便它向实现它的类添加一些特殊特性。如果有关类的信息保持不变,则可以使用标记接口来表示该信息。它主要用于 API 开发和 Spring 等框架中。
标记接口的类型
JDK 中存在许多内置的标记接口或带标签接口。下面显示了 3 个最常用的接口:
可序列化接口
可克隆接口
远程接口
让我们详细了解一下每个接口。
可序列化接口
可序列化接口是一个标记接口,它在 java.io 包中定义。要使类可序列化,必须实现 Serializable 接口。然后,根据需要可以序列化或反序列化该类的对象。
Java 中的序列化是一种将对象的状态转换为字节流的方式。它的主要用途是在网络上传输对象的状态。反序列化是序列化的逆过程,其中从序列化状态重建对象。必须具有对象定义才能成功地重新创建它。
语法
ObjectInputStream in = new ObjectInputStream(inputStream); Student s = (MyObject)in.readObject();
示例
Student.java import java.io.Serializable; // importing java.io package for serializable interface public class Student implements Serializable { // class declaration for implementing serializable interface int studentId; // variable declaration String studentName; // variable declaration public Student(int studentId, String studentName){ this.studentId = studentId; this.studentName = studentName; } } StudentSerialization.java import java.io.*;// java.io package imported class StudentSerialization{ // class declaration public static void main(String[] args) { // main function declaration try { // try block Student std = new Student(64,"JohnWick"); // creating object using Student class FileOutputStream fout=new FileOutputStream("Student File.txt"); // creating stream and writing the object ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(std); out.flush(); out.close(); // closing the stream System.out.println("Data read from the file"); } catch(Exception e) { // catch block e.printStackTrace(); } } }
输出
Data read from the file
可克隆接口
可克隆接口是一个标记接口,它在 java.lang 包中定义。它使用不同的名称克隆对象。此接口支持 Object 类的 clone() 方法。如果在类中未实现此接口,而不管是否调用 clone() 方法,它都会抛出 ClassNotSupportedException。
示例
import java.util.Scanner; // java.util package imported public class Clone implements Cloneable { // class declaration along with cloneable interface int studentId; String studentName; int studentClass; public Clone (int studentId, String studentName, int studentClass) { //Clone class constructor this.studentId = studentId; this.studentName = studentName; this.studentClass = studentClass; } public void printList() { // function to print details System.out.println("Student ID: "+studentId); System.out.println("Student Name: "+studentName); System.out.println("Student Class: "+studentClass); } public static void main (String args[]) throws CloneNotSupportedException { // main function declaration Scanner sc = new Scanner(System.in); // Scanner class object created System.out.print("Enter Student ID: "); // Reading user given values int studentId = sc.nextInt(); System.out.print("Enter Student name: "); String studentName = sc.next(); System.out.print("Enter Student Class: "); int studentClass = sc.nextInt(); System.out.println("-------Student Detail--------"); Clone p1 = new Clone(studentId, studentName, studentClass); Clone p2 = (Clone) p1.clone(); //cloning the object of the Student class using the clone() method p2.printList(); // invoking the method to print detail } }
输出
Enter Student ID: 64 Enter Student name: JohnWick Enter Student Class: 1 -------Student Detail-------- Student ID: 64 Student Name: JohnWick Student Class: 1
远程接口
远程接口是一个标记接口,它在 java.rmi 包中定义。它将对象标记为远程对象,该对象可由另一台机器(主机)访问。实现此接口后,对象可用作远程对象。它还识别其函数可以从 JVM 调用 的接口。任何远程对象都必须直接或间接地实现该接口。
语法
import java.rmi.*; public interface Multiply extends Remote{ public int mul(int p, int r, int t)throws RemoteException' }
自定义接口
自定义接口可以由用户创建,即它不是像上面三个接口那样的内置接口。
语法
interface <interface_name> { }
示例
interface Bullet720 { // custom marker interface } class Train implements Bullet720 { // class that implements the Bullet720 marker interface static void isTrain() {// static function to display System.out.println("Bullet720 is a Train."); } } public class CustomInterface { // main class declaration public static void main(String args[]) { // main function declaration Train.isTrain(); // invoking methods of the class Train } }
输出
Bullet720 is a Train.