marker interface java
Denna handledning förklarar vad som är ett markörgränssnitt i Java. Det täcker också Serialization Deserialization and Cloning in Java med kodexempel:
Vi kommer att diskutera det sista ämnet under gränssnitt, dvs. markörgränssnitt i Java.
När vi är färdiga med markörgränssnittet kommer vi att diskutera två exempel, dvs serieiserbart och klonbart gränssnitt i Java. Låt oss börja med gränssnittet Markör.
=> Besök här för att lära dig Java från Scratch
Vad du kommer att lära dig:
- Markörgränssnitt i Java
- Serialisering i Java
- Java Serializable Interface
- Klonabelt gränssnitt i Java
- Slutsats
Markörgränssnitt i Java
Ett markörgränssnitt i Java är ett tomt gränssnitt som inte har några fält eller metoder. Detta markörgränssnitt berättar för kompilatorn att objekten i klassen som implementerar markörgränssnittet är olika och att de ska behandlas annorlunda.
Varje markörgränssnitt i Java indikerar att det representerar något speciellt för JVM eller kompilator.
I Java har vi tre gränssnitt som är markörgränssnitt som visas nedan:
# 1) Serialiserbart gränssnitt: Serializable är ett markörgränssnitt som finns i java.io-paketet. Vi kan serieera objekt med detta gränssnitt, dvs spara objekttillståndet i en fil.
# 2) Klonabelt gränssnitt: Det klonbara gränssnittet är en del av paketet java.lang och gör det möjligt att klona objekten.
# 3) Fjärrgränssnitt: Fjärrgränssnittet är en del av paketet java.RMI och vi använder detta gränssnitt för att skapa RMI-applikationer. Detta gränssnitt handlar främst om avlägsna objekt.
I den här handledningen kommer vi att diskutera det serieiserbara och klonbara gränssnittet. Fjärrgränssnittet kommer att diskuteras när vi flyttar till RMI i Java.
Serialisering i Java
Innan vi går in på detaljerna i Serializable-gränssnittet i Java, låt oss förstå processen för serialisering såväl som deserialisering i Java.
Serialisering kan definieras som en process genom vilken vi konverterar objekttillståndet till dess motsvarande byteflöde för att lagra objektet i minnet i en fil eller envisas objektet.
När vi vill hämta objektet från dess sparade tillstånd och få tillgång till dess innehåll måste vi konvertera byteflödet tillbaka till det faktiska Java-objektet och denna process kallas deserialisering.
På det här sättet kan det finnas många tillfällen där vi behöver serialisera / deserialisera Java-objekt under en Java-applikations livstid.
Processen för serialisering / deserialisering visas nedan:
Som visas ovan omvandlar serialisering objektet till en ström. Deserialisering omvandlar byteflödet tillbaka till ett Java-objekt.
Hela mekanismen för serialisering och deserialisering är plattformsoberoende. Det betyder att vi kan serieera objektet på en plattform och sedan deserialisera det på en annan plattform.
När vi säger att vi har serieiserat Java-objektet betyder det att vi har kallat ObjectOutputStream-metoden writeObject () för att skriva objektet till en fil.
vad är en swf-filtyp
public final void writeObect (Object obj) kastar IOException
På samma sätt, vid deserialisering kallar vi metoden ObjectInputStream :: readObject () för att läsa data från filen som har lagrat objektet.
public final Objekt readObject () kastar IOException, ClassNotFoundException
Java Serializable Interface
Java tillhandahåller gränssnittet med namnet 'serialiserbart' med vilket vi kan implementera serialisering och deserialisering i Java.
Serialiserbart gränssnitt är en del av java.io-paketet. Det är ett exempel på ett markörgränssnitt som vi diskuterade ovan och0 som inte har några metoder eller medlemmar. Det serieiserbara gränssnittet ”markerar” Java-klasserna så att objekten i dessa klasser får möjlighet att bestå sig själva.
Så den klass vars objekt vi behöver bestå bör implementera Serializable-gränssnittet. Sedan använder objektet för den här klassen (implementering av Serializable-gränssnitt) skrivObject () respektive readObject () -metoder för serialisering och deserialisering av klassobjektet.
Observera att alla omslagsklasser och strängklassen implementerar java.io.Serializable som standard.
Vi bör uppfylla följande villkor för att ett objekt ska framgångsrikt serienummeras:
- Klassen vars objekt serieras måste implementera java.io.Serialiserbart gränssnitt.
- Alla medlemsfält i klassen måste vara serienummerbara. Om ett visst fält inte kan serieras bör vi markera det som övergående.
Omvänt kan en klass endast serialiseras om den implementerar java.io.Serialiserbart gränssnitt, annars kan den inte serialiseras.
Hur man serialiserar och avserialiserar ett objekt i Java
När vi serierar ett objekt i Java använder vi objectOutputStreams writeObject-metod för att skriva objektet till en fil.
För deserialisering av objektet i Java använder vi ObjectInputStreams readObject () -metod för att läsa innehållet i filen och läsa dem i ett objekt.
I detta exempel, vi har en studentklass som implementerar gränssnittet Serializable. Det betyder att vi kan serie- eller deserialisera objekten i studentklassen.
I huvudmetoden för Java-programmet skapar vi ett studentklassobjekt. Sedan skapar vi ett ObjectOutputStream som pekar på ett FileOutputStream-objekt som i sin tur pekar på en fil där vi behöver skriva Student-objektet. Sedan kallar vi metoden writeObject () som skriver objektet till filen.
När du har skrivit det angivna objektet till den angivna filen, ger programmet ett lämpligt utdatameddelande. Vi avserialiserar sedan objektet genom att vända ovanstående process. Först skapar vi ett ObjectOutputStream-objekt där vi läser filen vars innehåll ska läsas.
Vi använder sedan metoden readObject () för att läsa innehållet och kasta det till studentobjektet. Sedan skriver vi ut innehållet i studentobjektet.
Exempel på serialisering / deserialisering
Följande Java-program visar serialiserings- / deserialiseringsmekanismen i Java som diskuterats ovan.
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);} } }
Produktion:
Observera att efter deserialisering får vi samma objekt som vi har serialiserat tidigare när vi öppnar samma fil igen.
Java Transient Keyword
Ett övergående nyckelord används för att göra en datamedlem tillfällig, det vill säga vi vill inte serieera det.
Till exempel, överväga följande klass Anställd. Här har vi medarbetar-ID-fältet tillsammans med de andra fälten. Nu om vi bestämmer att fältet för anställd-id inte ska serienummeras, förklarar vi det som ”övergående”.
Ett exempel på Java-program ges nedan.
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);} } }
Produktion:
I ovanstående program har vi serieiserat medarbetarobjektet. Men notera att anställd-id-fältet i medarbetarklassen förklaras 'övergående'. Nu för att kontrollera serialiseringen avserialiserar vi objektet. Utdata visar anställdsobjektet som '0 Eddie'. Detta innebär att anställd-ID inte sparades i filen.
Java.io.NotSerializableException i Java
Undantaget java.io.NotSerializableException är ett undantag som kastas när klassen inte är berättigad till serialisering. Klassen som inte implementerar Serializable-gränssnittet blir inte kvalificerad för serialisering.
Nedanstående Java-program visar 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);} } }
Produktion:
Som framgår av ovanstående program implementerar inte anställdsklassen Serializable-gränssnittet. Därför kastas NotSerializableException när vi försöker serieera objektet Klass för anställda.
Klonabelt gränssnitt i Java
Kloning av objekt innebär att man gör en kopia av objekten. Java stöder objektkloning med hjälp av ' Klonbar ”Gränssnitt. Det klonbara gränssnittet är ett markörgränssnitt och är en del av paketet java.lang.
När en klass implementerar det klonabla gränssnittet innebär det att vi kan klona objekten i den här klassen. Objektklassen för Java innehåller ' klona () -Metoden. Så klonabelt gränssnitt implementerat av en viss klass auktoriserar metoden clone () för att göra kopior av klassinstanser.
Om en klass inte implementerar ett Cloneable-gränssnitt och ändå åberopar metoden clone (), är undantaget CloneNotSupportedException kastas av Java-kompilatorn.
Klasser som implementerar Cloneable-gränssnittet bör åsidosätta metoden clone ().
Så vad är objektkloning?
Objektkloning är en process där vi skapar en exakt kopia av objektet med hjälp av klon () -metoden i Object-klassen. För att klon () -metoden ska åsidosättas och åberopas måste klassen implementera Cloneable-gränssnittet.
Den allmänna syntaxen för klonmetoden () ges nedan:
skyddade Objektklon () kastar CloneNotSupportedException
Metoden clone () skapar en exakt kopia av objektet med kortare bearbetningstid än det som krävs för att skapa ett nytt objekt med hjälp av det nya nyckelordet.
Nedanstående Java-program visar användningen av klonmetoden () och det klonabla gränssnittet.
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){} } }
Produktion:
I det här programmet har vi en studentklass som implementerar Cloneable-gränssnittet. Det åsidosätter också metoden clone () genom att anropa metoden super.clone (). I huvudmetoden skapar vi ett nytt studentobjekt och ringer sedan metoden clone () på det här objektet som returnerar det nya studentobjektet.
Clone Array I Java
Vi utforskade kloning av matriser i vår handledning om Arrays. Eftersom Java-arrays implementerar Cloneable-gränssnittet som standard behöver de inte uttryckligen implementeras. När den endimensionella matrisen klonas genereras en djup kopia av matrisen. När en tvådimensionell grupp klonas görs en grunt kopia.
Att göra en grunt kopia är standardbeteendet för klonmetoden () i Java. Men oftast önskar vi djup kloning. Vid djup kloning gör vi en kopia av objektmedlemmen efter medlem och skapar en klon som är oberoende av det ursprungliga objektet. Eventuella ändringar som görs i klonobjektet återspeglas inte i det ursprungliga objektet.
Följande Java-program visar kloning av en endimensionell matris.
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 Produktion:

Klonlista i Java
Programmet nedan visar hur man använder en klonmetod () för att klona en lista i Java.
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); } }
Produktion:

I ovanstående program ser vi att vi har skapat en MyList-klass som implementerar det klonabla gränssnittet och inom denna klass åsidosätter vi klonmetoden () som hjälper oss att klona listan. I huvudmetoden skapar vi en lista med element och klonar sedan varje element i listan genom att itera över listan.
Vanliga frågor
F # 1) Vad använder Marker Interface i Java?
Svar: Markörgränssnitt som även kallas ”taggat gränssnitt” märker klassen och informerar kompilatorn om att denna klass kan implementera ett speciellt beteende.
F # 2) Vilka är alla markörgränssnitt i Java?
Svar: Serializable, Cloneable och Remote är gränssnitten som är exempel på markörgränssnitt i Java.
Fråga # 3) Varför är ett seriellt gränssnitt ett markörgränssnitt?
Svar: Det serieiserbara gränssnittet har inga metoder eller medlemsvariabler. Det är ett tomt gränssnitt som klassificerar det som ett markörgränssnitt.
F # 4) Kan köras ett markörgränssnitt?
Svar: Nej, körbar är inte ett markörgränssnitt. Det körbara gränssnittet är inte tomt och det ger en run () metoddeklaration inuti det.
F # 5) Varför behöver vi implementera ett Cloneable-gränssnitt?
Svar: Genom att implementera ett klonbart gränssnitt för en klass indikerar vi att objekten i den här klassen kan klonas med hjälp av klon () -metoden i Object-klassen. Om en klass som använder klon () -metoden inte implementerar ett klonbart gränssnitt kastas undantaget 'CloneNotSupportedException'.
Slutsats
Med den här guiden har vi slutfört vår diskussion om gränssnitt i Java. Vi har diskuterat begreppet gränssnitt, deras struktur, definition, användning etc. Vi har också diskuterat några av de viktiga gränssnitten i Java-liknande Comparable, Comparator, Marker-gränssnitt etc.
I den här handledningen diskuterade vi två exempel på markörgränssnitt, dvs. Ett seriöst gränssnitt används för att bestå ett objekt. Det klonbara gränssnittet används för att klona klassobjekten. Båda dessa gränssnitt är markörgränssnitt, dvs. de är tomma.
Men när en klass implementerar dem, indikerar de att kompilatorn kan förvänta sig något speciellt beteende från klasserna som implementerar dem.
Till exempel, när en klass implementerar ett Serialiserbart gränssnitt kan vi serie- eller deserialisera klassobjekten och spara / hämta deras tillstånd.
En klass som implementerar ett klonbart gränssnitt indikerar att vi kan klona objekten i den här klassen. Standardimplementeringen av clone () -metoden skapar en grund kopia av objektet medan vi kan åsidosätta clone () -metoden för att skapa en djup kopia.
=> Utforska hela Java-träningsserien här
Rekommenderad läsning
- Ställ in gränssnitt i Java: Java Set-handledning med exempel
- ListIterator-gränssnitt i Java med exempel
- Java-distribution: Skapande och utförande av Java JAR-fil
- Och Java - och dess implementering och definitioner
- Java Basics: Java Syntax, Java Class och Core Java Concepts
- Java Class Vs Object - Hur man använder klass och objekt i Java
- Java Virtual Machine: Hur JVM hjälper till att köra Java-applikationen
- Jämförbara och komparatorgränssnitt i Java