marker interface java
In diesem Tutorial wird erklärt, was eine Marker-Schnittstelle in Java ist. Es behandelt auch die Deserialisierung und das Klonen von Serialisierung in Java mit Codebeispielen:
Wir werden das letzte Thema unter Schnittstellen diskutieren, d. H. Marker-Schnittstelle in Java.
Nachdem wir mit der Marker-Schnittstelle fertig sind, werden wir zwei Beispiele diskutieren, d. H. Die serialisierbare und klonbare Schnittstelle in Java. Beginnen wir mit der Marker-Oberfläche.
=> Besuchen Sie hier, um Java von Grund auf neu zu lernen
Was du lernen wirst:
- Markierungsschnittstelle In Java
- Serialisierung in Java
- Java Serializable Interface
- Klonbare Schnittstelle in Java
- Fazit
Markierungsschnittstelle In Java
Eine Markierungsschnittstelle in Java ist eine leere Schnittstelle ohne Felder oder Methoden. Diese Markierungsschnittstelle teilt dem Compiler mit, dass die Objekte der Klasse, die die Markierungsschnittstelle implementieren, unterschiedlich sind und dass sie unterschiedlich behandelt werden sollten.
Jede Markierungsschnittstelle in Java gibt an, dass sie für JVM oder Compiler etwas Besonderes darstellt.
In Java haben wir drei Schnittstellen, die Marker-Schnittstellen sind, wie unten gezeigt:
# 1) Serialisierbare Schnittstelle: Serializable ist eine Markierungsschnittstelle, die im Paket java.io enthalten ist. Über diese Schnittstelle können wir Objekte serialisieren, d. H. Den Objektstatus in einer Datei speichern.
# 2) Klonbare Schnittstelle: Die klonbare Schnittstelle ist Teil des Pakets java.lang und ermöglicht das Klonen der Objekte.
# 3) Remote-Schnittstelle: Die Remote-Schnittstelle ist Teil des Pakets java.RMI und wir verwenden diese Schnittstelle, um RMI-Anwendungen zu erstellen. Diese Schnittstelle befasst sich hauptsächlich mit entfernten Objekten.
In diesem Tutorial werden wir die serialisierbare und klonbare Schnittstelle diskutieren. Die Remote-Schnittstelle wird erläutert, wenn wir in Java zu RMI wechseln.
Serialisierung in Java
Bevor wir uns mit den Details der serialisierbaren Oberfläche in Java befassen, wollen wir den Prozess der Serialisierung sowie der Deserialisierung in Java verstehen.
Die Serialisierung kann als ein Prozess definiert werden, bei dem der Objektstatus in seinen entsprechenden Bytestream konvertiert wird, um das Objekt im Speicher in einer Datei oder zu speichern fortdauern das Objekt.
Wenn wir das Objekt aus seinem gespeicherten Zustand abrufen und auf seinen Inhalt zugreifen möchten, müssen wir den Bytestream zurück in das eigentliche Java-Objekt konvertieren. Dieser Vorgang wird als Deserialisierung bezeichnet.
Auf diese Weise kann es viele Fälle geben, in denen Java-Objekte in einer lebenslangen Java-Anwendung serialisiert / deserialisiert werden müssen.
Der Prozess der Serialisierung / Deserialisierung ist unten dargestellt:
Wie oben gezeigt, konvertiert die Serialisierung das Objekt in einen Stream. Durch die Deserialisierung wird der Bytestream zurück in ein Java-Objekt konvertiert.
Der gesamte Mechanismus der Serialisierung und Deserialisierung ist plattformunabhängig. Dies bedeutet, dass wir das Objekt auf einer Plattform serialisieren und dann auf einer anderen Plattform deserialisieren können.
Wenn wir sagen, dass wir das Java-Objekt serialisiert haben, bedeutet dies, dass wir die ObjectOutputStream-Methode writeObject () aufgerufen haben, um das Objekt in eine Datei zu schreiben.
Was sind die SDLC-Phasen?
public final void writeObect (Object obj) löst eine IOException aus
In ähnlicher Weise rufen wir im Fall der Deserialisierung die ObjectInputStream :: readObject () -Methode auf, um die Daten aus der Datei zu lesen, in der das Objekt gespeichert ist.
public final Object readObject () löst IOException, ClassNotFoundException aus
Java Serializable Interface
Java bietet die Schnittstelle mit dem Namen 'serialisierbar', mit der wir Serialisierung und Deserialisierung in Java implementieren können.
Die serialisierbare Schnittstelle ist Teil des Pakets java.io. Es ist ein Beispiel für eine Markierungsschnittstelle, die wir oben und 0 besprochen haben und die keine Methoden oder Elemente enthält. Die serialisierbare Schnittstelle markiert die Java-Klassen, sodass die Objekte dieser Klassen die Fähigkeit erhalten, sich selbst zu erhalten.
Daher sollte die Klasse, deren Objekt wir beibehalten müssen, die serialisierbare Schnittstelle implementieren. Dann verwendet das Objekt dieser Klasse (Implementierung der serialisierbaren Schnittstelle) die Methoden writeObject () und readObject () zum Serialisieren und Deserialisieren des Klassenobjekts.
Beachten Sie, dass alle Wrapper-Klassen und die String-Klasse standardmäßig java.io.Serializable implementieren.
Wir sollten die folgende Bedingung erfüllen, damit ein Objekt erfolgreich serialisiert werden kann:
- Die Klasse, deren Objekte serialisiert sind, muss die Schnittstelle java.io.Serializable implementieren.
- Alle Mitgliedsfelder der Klasse müssen serialisierbar sein. Wenn ein bestimmtes Feld nicht serialisierbar ist, sollten wir es als vorübergehend markieren.
Umgekehrt ist eine Klasse nur dann serialisierbar, wenn sie die Schnittstelle java.io.Serializable implementiert, andernfalls ist sie nicht serialisierbar.
So serialisieren und deserialisieren Sie ein Objekt in Java
Wenn wir ein Objekt in Java serialisieren, verwenden wir die writeObject-Methode von objectOutputStream, um das Objekt in eine Datei zu schreiben.
Zum Deserialisieren des Objekts in Java verwenden wir die readObject () -Methode von ObjectInputStream, um den Inhalt der Datei zu lesen und in ein Objekt einzulesen.
In diesem Beispiel Wir haben eine Student-Klasse, die die serialisierbare Schnittstelle implementiert. Dies bedeutet, dass wir die Objekte der Student-Klasse serialisieren oder deserialisieren können.
In der Hauptmethode des Java-Programms erstellen wir ein Student-Klassenobjekt. Dann erstellen wir einen ObjectOutputStream, der auf ein FileOutputStream-Objekt verweist, das wiederum auf eine Datei verweist, in die wir das Student-Objekt schreiben müssen. Dann rufen wir die Methode writeObject () auf, die das Objekt in die Datei schreibt.
Wenn das angegebene Objekt erfolgreich in die angegebene Datei geschrieben wurde, gibt das Programm eine entsprechende Ausgabemeldung aus. Wir deserialisieren dann das Objekt, indem wir den obigen Prozess umkehren. Zuerst erstellen wir ein ObjectOutputStream-Objekt, in dem wir die Datei lesen, deren Inhalt gelesen werden soll.
Wir verwenden dann die readObject () -Methode, um den Inhalt zu lesen und ihn in das Student-Objekt umzuwandeln. Dann drucken wir den Inhalt des Student-Objekts.
Beispiel für Serialisierung / Deserialisierung
Das folgende Java-Programm zeigt den Serialisierungs- / Deserialisierungsmechanismus in Java, wie oben erläutert.
import java.io.*; import java.io.Serializable; //Class Student implements class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of student class Student s1 =new Student(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); //Create a stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('Eddie.txt')); Student s=(Student)in.readObject(); //print the data of the deserialized object System.out.println('Student object: ' + s.id+' '+s.name); //close the stream in.close(); }catch(Exception e){System.out.println(e);} } }
Ausgabe:
Beachten Sie, dass wir nach der Deserialisierung dasselbe Objekt erhalten, das wir zuvor serialisiert haben, wenn wir dieselbe Datei erneut öffnen.
Java Transient Keyword
Ein vorübergehendes Schlüsselwort wird verwendet, um ein Datenelement vorübergehend zu machen, d. H. Wir möchten es nicht serialisieren.
Zum Beispiel, Betrachten Sie die folgende Klasse Mitarbeiter. Hier haben wir das Mitarbeiter-ID-Feld zusammen mit den anderen Feldern. Wenn wir nun entscheiden, dass das Feld 'Mitarbeiter-ID' nicht serialisiert werden soll, deklarieren wir es als 'vorübergehend'.
Ein Beispiel für ein Java-Programm ist unten angegeben.
import java.io.*; class Employee implements Serializable{ transient int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of Employee class Employee s1 =new Employee(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); //Create a stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('Eddie.txt')); Employee s=(Employee)in.readObject(); //print the data of the deserialized object System.out.println('Employee object: ' + s.id+' '+s.name); //close the stream in.close(); }catch(Exception e){System.out.println(e);} } }
Ausgabe:
Im obigen Programm haben wir das Employee-Objekt serialisiert. Beachten Sie jedoch, dass das Feld 'Mitarbeiter-ID' der Mitarbeiter-Klasse als 'vorübergehend' deklariert ist. Um nun die Serialisierung zu überprüfen, deserialisieren wir das Objekt. Die Ausgabe zeigt das Employee-Objekt als '0 Eddie'. Dies bedeutet, dass die Mitarbeiter-ID nicht in der Datei gespeichert wurde.
Java.io.NotSerializableException In Java
Die Ausnahme von java.io.NotSerializableException ist eine Ausnahme, die ausgelöst wird, wenn die Klasse nicht für die Serialisierung geeignet ist. Die Klasse, die die serialisierbare Schnittstelle nicht implementiert, kann nicht mehr serialisiert werden.
Das folgende Java-Programm demonstriert die NotSerializableException.
import java.io.*; class Employee { transient int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of Employee class Employee s1 =new Employee(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); }catch(Exception e){System.out.println(e);} } }
Ausgabe:
Wie aus dem obigen Programm hervorgeht, implementiert die Employee-Klasse die serialisierbare Schnittstelle nicht. Wenn wir versuchen, das Employee-Klassenobjekt zu serialisieren, wird daher die NotSerializableException ausgelöst.
Klonbare Schnittstelle in Java
Das Klonen von Objekten bedeutet, eine Kopie der Objekte zu erstellen. Java unterstützt das Klonen von Objekten mit dem “ Klonbar ”Schnittstelle. Die klonbare Schnittstelle ist eine Markierungsschnittstelle und Teil des Pakets java.lang.
Wenn eine Klasse die klonbare Schnittstelle implementiert, bedeutet dies, dass wir die Objekte dieser Klasse klonen können. Die Object-Klasse von Java enthält die Klon ()' Methode. Die von einer bestimmten Klasse implementierte klonbare Schnittstelle autorisiert die clone () -Methode, Kopien von Klasseninstanzen zu erstellen.
Wenn eine Klasse keine klonbare Schnittstelle implementiert und dennoch die clone () -Methode aufruft, ist dies die Ausnahme CloneNotSupportedException wird vom Java-Compiler ausgelöst.
Klassen, die die klonbare Schnittstelle implementieren, sollten die clone () -Methode überschreiben.
Was ist Objektklonen?
Das Klonen von Objekten ist ein Prozess, mit dem wir mithilfe der clone () -Methode der Object-Klasse eine exakte Kopie des Objekts erstellen. Damit die clone () -Methode überschrieben und aufgerufen werden kann, muss die Klasse die klonbare Schnittstelle implementieren.
Die allgemeine Syntax der clone () -Methode ist unten angegeben:
geschützt Objektklon () wirft CloneNotSupportedException
Die clone () -Methode erstellt eine exakte Kopie des Objekts mit weniger Verarbeitungszeit als die, die zum Erstellen eines neuen Objekts mit dem neuen Schlüsselwort benötigt wird.
Das folgende Java-Programm demonstriert die Verwendung der clone () -Methode und der klonbaren Schnittstelle.
class Student implements Cloneable{ int rollno; String name; //class constructor Student(int rollno,String name){ this.rollno=rollno; this.name=name; } //clone method public Object clone()throws CloneNotSupportedException{ return super.clone(); } } class Main{ public static void main(String args()){ try{ Student s1=new Student(101,'Lissa'); //clone the s1 object Student s2=(Student)s1.clone(); System.out.println('Original Student object: ' + s1.rollno+' '+s1.name); System.out.println('Cloned Student object: ' + s2.rollno+' '+s2.name); }catch(CloneNotSupportedException c){} } }
Ausgabe:
In diesem Programm haben wir eine Student-Klasse, die die klonbare Schnittstelle implementiert. Außerdem wird die Methode clone () überschrieben, indem die Methode super.clone () aufgerufen wird. In der Hauptmethode erstellen wir ein neues Student-Objekt und rufen dann die clone () -Methode für dieses Objekt auf, die das neue Student-Objekt zurückgibt.
Array in Java klonen
Wir haben das Klonen von Arrays in unserem Tutorial zu Arrays untersucht. Da Java-Arrays standardmäßig die klonbare Schnittstelle implementieren, müssen sie nicht explizit implementiert werden. Wenn das eindimensionale Array geklont wird, wird eine tiefe Kopie des Arrays generiert. Wenn ein zweidimensionales Array geklont wird, wird eine flache Kopie erstellt.
Das Erstellen einer flachen Kopie ist das Standardverhalten der clone () -Methode in Java. Aber die meiste Zeit wünschen wir uns tiefes Klonen. Beim Deep Cloning erstellen wir eine Kopie des Objekts Mitglied für Mitglied und erstellen einen Klon, der vom ursprünglichen Objekt unabhängig ist. Alle Änderungen, die dann am Klonobjekt vorgenommen werden, werden nicht im ursprünglichen Objekt wiedergegeben.
Das folgende Java-Programm zeigt das Klonen eines eindimensionalen Arrays.
class Main { public static void main(String args()) { //define an array int intArray() = {2,6,3,7,1,8}; //invoke clone () method on intArray int cloneArray() = intArray.clone(); //print the arrays. System.out.println('Original intArray:'); for (int i = 0; i Ausgabe:
Klonliste In Java
Das folgende Programm zeigt, wie Sie mit einer clone () -Methode eine Liste in Java klonen.
import java.util.ArrayList; import java.util.Arrays; import java.util.List; // MyList Class implementing cloneable class MyList implements Cloneable { String name1; String name2; // Constructor MyList(String name1, String name2) { this.name1 = name1; this.name2 = name2; } // To print the objects in the desired format @Override public String toString() { return 'Hello ' + name1 + ',' + name2 + '
' ; } // Overriding the clone method @Override protected MyList clone() { return new MyList(name1 , name2); } } class Main { public static void main(String() args) { // Create a list List original = Arrays.asList( new MyList('Sydney','Rose'), new MyList('Joe','Ian')); // Create an empty list List cloned_list = new ArrayList(); // Loop through the list and clone each element for (MyList temp : original) cloned_list.add(temp.clone()); System.out.print(cloned_list); } }
Ausgabe:
Im obigen Programm sehen wir, dass wir eine MyList-Klasse erstellt haben, die die klonbare Schnittstelle implementiert, und innerhalb dieser Klasse die clone () -Methode überschreiben, mit der wir die Liste klonen können. In der Hauptmethode erstellen wir eine Liste von Elementen und klonen dann jedes Element der Liste, indem wir über die Liste iterieren.
Häufig gestellte Fragen
F # 1) Was ist die Verwendung der Marker-Schnittstelle in Java?
Antworten: Die Markierungsschnittstelle, die auch als 'markierte Schnittstelle' bezeichnet wird, markiert die Klasse und informiert den Compiler darüber, dass diese Klasse möglicherweise ein spezielles Verhalten implementiert.
F # 2) Was sind alle Marker-Schnittstellen in Java?
Antworten: Serializable, Cloneable und Remote sind die Schnittstellen, die Beispiele für Marker-Schnittstellen in Java sind.
F # 3) Warum ist eine Marker-Schnittstelle serialisierbar?
Antworten: Die serialisierbare Schnittstelle verfügt über keine Methoden oder Elementvariablen. Es ist eine leere Schnittstelle, die sie als Markierungsschnittstelle klassifiziert.
F # 4) Kann eine Marker-Schnittstelle ausgeführt werden?
Antworten: Nein, runnable ist keine Markierungsschnittstelle. Die ausführbare Schnittstelle ist nicht leer und enthält eine Deklaration der run () -Methode.
F # 5) Warum müssen wir eine klonbare Schnittstelle implementieren?
Antworten: Durch die Implementierung einer klonbaren Schnittstelle für eine Klasse geben wir an, dass die Objekte dieser Klasse mit der clone () -Methode der Object-Klasse geklont werden können. Wenn eine Klasse, die die Methode clone () verwendet, keine klonbare Schnittstelle implementiert, wird die Ausnahme 'CloneNotSupportedException' ausgelöst.
Fazit
Mit diesem Tutorial haben wir unsere Diskussion über Schnittstellen in Java abgeschlossen. Wir haben das Konzept von Schnittstellen, ihre Struktur, Definition, Verwendung usw. besprochen. Wir haben auch einige wichtige Schnittstellen in Java-ähnlichen Comparable-, Comparator-, Marker-Schnittstellen usw. besprochen.
In diesem Tutorial haben wir zwei Beispiele für Marker-Schnittstellen diskutiert, d. H. Serialisierbar und klonbar. Eine serialisierbare Schnittstelle wird verwendet, um ein Objekt beizubehalten. Die klonbare Schnittstelle wird zum Klonen der Klassenobjekte verwendet. Diese beiden Schnittstellen sind Markierungsschnittstellen, d. H. Sie sind leer.
Wenn eine Klasse sie implementiert, zeigen sie an, dass der Compiler von den Klassen, die sie implementieren, ein besonderes Verhalten erwarten kann.
Zum Beispiel, Wenn eine Klasse eine serialisierbare Schnittstelle implementiert, können wir die Klassenobjekte serialisieren oder deserialisieren und ihren Status speichern / abrufen.
Eine Klasse, die eine klonbare Schnittstelle implementiert, gibt an, dass wir die Objekte dieser Klasse klonen können. Die Standardimplementierung der clone () -Methode erstellt eine flache Kopie des Objekts, während wir die clone () -Methode überschreiben können, um eine tiefe Kopie zu erstellen.
=> Entdecken Sie hier die komplette Java-Schulungsserie
Literatur-Empfehlungen
- Set Interface In Java: Java Set Tutorial mit Beispielen
- ListIterator-Schnittstelle in Java mit Beispielen
- Java-Bereitstellung: Erstellung und Ausführung einer Java-JAR-Datei
- Und das Java - und seine Implementierung und Definitionen
- Java-Grundlagen: Java-Syntax, Java-Klasse und Java-Kernkonzepte
- Java Class Vs Object - Verwendung von Klasse und Objekt in Java
- Java Virtual Machine: Wie JVM beim Ausführen von Java-Anwendungen hilft
- Vergleichbare und vergleichende Schnittstellen in Java