marker interface java
Tento výukový program vysvětluje, co je rozhraní Marker v Javě. Zahrnuje také Serializační deserializaci a klonování v Javě s příklady kódu:
Budeme diskutovat o posledním tématu v rámci rozhraní, tj. Marker Interface v Javě.
Poté, co skončíme s markerovým rozhraním, probereme dva příklady, tj. Serializovatelné a klonovatelné rozhraní v Javě. Začněme rozhraním Marker.
=> Navštivte zde a dozvíte se Java od začátku
Co se naučíte:
- Rozhraní značek v Javě
- Serializace v Javě
- Serializovatelné rozhraní Java
- Klonovatelné rozhraní v Javě
- Závěr
Rozhraní značek v Javě
Rozhraní značek v jazyce Java je prázdné rozhraní, které neobsahuje žádná pole ani metody. Toto rozhraní značek říká kompilátoru, že objekty třídy, které implementují rozhraní značek, se liší a že by se s nimi mělo zacházet odlišně.
Každé značkovací rozhraní v Javě naznačuje, že představuje něco zvláštního pro JVM nebo kompilátor.
V Javě máme tři rozhraní, která jsou rozhraním Marker, jak je znázorněno níže:
# 1) Serializovatelné rozhraní: Serializable je rozhraní značek přítomné v balíčku java.io. Pomocí tohoto rozhraní můžeme serializovat objekty, tj. Uložit stav objektu do souboru.
# 2) Klonovatelné rozhraní: Klonovatelné rozhraní je součástí balíčku java.lang a umožňuje klonování objektů.
# 3) Vzdálené rozhraní: Vzdálené rozhraní je součástí balíčku java.RMI a toto rozhraní používáme k vytváření aplikací RMI. Toto rozhraní se zabývá hlavně vzdálenými objekty.
V tomto kurzu probereme serializovatelné a klonovatelné rozhraní. Vzdálené rozhraní bude probráno, když přejdeme na RMI v Javě.
Serializace v Javě
Než se pustíme do podrobností Serializovatelného rozhraní v Javě, pojďme pochopit proces serializace i deserializace v Javě.
Serializaci lze definovat jako proces, kterým převedeme stav objektu na jeho ekvivalentní bajtový proud, abychom objekt uložili do paměti v souboru nebo přetrvávat objekt.
Když chceme načíst objekt z jeho uloženého stavu a získat přístup k jeho obsahu, budeme muset převést bajtový proud zpět na skutečný objekt Java a tento proces se nazývá deserializace.
Tímto způsobem může existovat mnoho případů, kdy budeme muset serializovat / deserializovat objekty Java v průběhu životnosti aplikace Java.
Proces serializace / deserializace je uveden níže:
Jak je uvedeno výše, serializace převede objekt na stream. Deserializace převádí bajtový proud zpět na objekt Java.
Celý mechanismus serializace a deserializace je nezávislý na platformě. To znamená, že můžeme objekt serializovat na jedné platformě a poté deserializovat na jiné platformě.
Když říkáme, že jsme serializovali objekt Java, znamená to, že jsme volali metodu ObjectOutputStream writeObject (), která zapíše objekt do souboru.
public final void writeObect (Object obj) vyvolá IOException
Podobně v případě deserializace voláme metodu ObjectInputStream :: readObject () ke čtení dat ze souboru, který má objekt uložený.
public final Object readObject () vyvolá IOException, ClassNotFoundException
Serializovatelné rozhraní Java
Java poskytuje rozhraní s názvem „serializovatelné“, pomocí kterého můžeme implementovat serializaci a deserializaci v Javě.
zdarma jednoduchý převodník z youtube na mp3
Serializovatelné rozhraní je součástí balíčku java.io. Je to příklad značkovacího rozhraní, o kterém jsme diskutovali výše, a 0, které nemá žádné metody ani členy. Serializovatelné rozhraní „označuje“ třídy Java, aby objekty těchto tříd získaly schopnost přetrvávat.
Takže třída, jejíž objekt musíme přetrvávat, by měla implementovat Serializovatelné rozhraní. Pak objekt této třídy (implementující rozhraní Serializable) použije metody writeObject () a readObject () pro serializaci a deserializaci objektu třídy.
Všimněte si, že všechny třídy obálky a třída String ve výchozím nastavení implementují java.io.Serializable.
Aby byl objekt úspěšně serializován, měli bychom splnit následující podmínku:
- Třída, jejíž objekty jsou serializovány, musí implementovat rozhraní java.io.Serializable.
- Všechna pole členů třídy musí být serializovatelná. Pokud určité pole nelze serializovat, měli bychom jej označit jako přechodné.
Naopak třída je serializovatelná, pouze pokud implementuje rozhraní java.io.Serializable, jinak není serializovatelná.
Jak serializovat a deserializovat objekt v Javě
Když serializujeme objekt v Javě, použijeme k zápisu objektu do souboru metodu writeObject objektu objectOutputStream.
Pro deserializaci objektu v Javě používáme metodu readObject () ObjectInputStream ke čtení obsahu souboru a jeho načtení do objektu.
V tomto příkladu máme třídu Student, která implementuje rozhraní Serializable. To znamená, že můžeme serializovat nebo deserializovat objekty třídy Student.
V hlavní metodě programu Java vytvoříme objekt třídy Student. Pak vytvoříme ObjectOutputStream, který ukazuje na FileOutputStream objekt, který zase ukazuje na soubor, do kterého musíme napsat Studentův objekt. Pak zavoláme metodu writeObject (), která zapíše objekt do souboru.
Po úspěšném zápisu zadaného objektu do zadaného souboru program vydá příslušnou výstupní zprávu. Poté objekt rekonstruujeme obrácením výše uvedeného procesu. Nejprve vytvoříme ObjectOutputStream objekt, ve kterém načteme soubor, jehož obsah se má číst.
Potom použijeme metodu readObject () ke čtení obsahu a jeho odeslání do Studentova objektu. Poté vytiskneme obsah Studentova objektu.
Příklad serializace / deserializace
Následující program Java ukazuje mechanismus serializace / deserializace v Javě, jak je popsáno výše.
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);} } }
Výstup:
Všimněte si, že po deserializaci dostaneme stejný objekt, který jsme dříve serializovali, když znovu otevíráme stejný soubor.
Přechodné klíčové slovo Java
Přechodné klíčové slovo se používá k vytvoření přechodného datového člena, tj. Nechceme jej serializovat.
Například, zvažte následující třídu Zaměstnanec. Zde máme pole ID zaměstnance spolu s dalšími poli. Nyní, pokud se rozhodneme, že pole ID zaměstnance by nemělo být serializováno, deklarujeme to jako „přechodné“.
Níže je uveden příklad Java programu.
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);} } }
Výstup:
Ve výše uvedeném programu jsme serializovali objekt Employee. Všimněte si však, že pole Employee id ve třídě Employee je deklarováno jako „přechodné“. Nyní pro kontrolu serializace objekt rekonstruujeme. Výstup zobrazuje objekt Employee jako „0 Eddie“. To znamená, že ID zaměstnance nebylo uloženo do souboru.
Java.io.NotSerializableException v Javě
Výjimkou java.io.NotSerializableException je výjimka, která je vyvolána, když třída není způsobilá pro serializaci. Třída, která neimplementuje Serializovatelné rozhraní, se stane nevhodnou pro serializaci.
Níže uvedený program Java demonstruje 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);} } }
Výstup:
Jak je patrné z výše uvedeného programu, třída Employee neimplementuje rozhraní Serializable. Proto při pokusu o serializaci objektu třídy Employee je vyvolána NotSerializableException.
Klonovatelné rozhraní v Javě
Klonování objektů znamená vytvoření kopie objektů. Java podporuje klonování objektů pomocí „ Cloneable ' rozhraní. Klonovatelné rozhraní je rozhraní značek a je součástí balíčku java.lang.
Když třída implementuje rozhraní Cloneable, znamená to, že můžeme klonovat objekty této třídy. Třída Object v Javě obsahuje ‚ klon () Metoda. Takže rozhraní Cloneable implementované konkrétní třídou autorizuje metodu clone () k vytváření kopií instancí tříd.
Pokud třída neimplementuje rozhraní Cloneable a přesto vyvolá metodu clone (), pak výjimku CloneNotSupportedException je vyvolána kompilátorem Java.
Třídy implementující rozhraní Cloneable by měly přepsat metodu clone ().
Co je tedy klonování objektů?
Klonování objektů je proces, pomocí kterého vytváříme přesnou kopii objektu pomocí metody clone () třídy Object. Aby byla metoda clone () přepsána a vyvolána, musí třída implementovat rozhraní Cloneable.
Obecná syntaxe metody clone () je uvedena níže:
chráněný Klon objektu () hodí CloneNotSupportedException
Metoda clone () vytvoří přesnou kopii objektu s kratší dobou zpracování, než je doba potřebná pro vytvoření nového objektu pomocí nového klíčového slova.
Níže uvedený program Java demonstruje použití metody clone () a rozhraní Cloneable.
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){} } }
Výstup:
V tomto programu máme třídu Student implementující rozhraní Cloneable. Také přepíše metodu clone () voláním metody super.clone (). V hlavní metodě vytvoříme nový Studentův objekt a poté zavoláme metodu clone () na tento objekt, který vrátí nový Studentský objekt.
Clone Array In Java
Klonování polí jsme prozkoumali v našem výukovém programu Pole. Protože pole Java implicitně implementují Cloneable interface, nemusí být explicitně implementována. Když je jednorozměrné pole naklonováno, vygeneruje se hluboká kopie pole. Když je klonováno 2-dimenzionální pole, vytvoří se mělká kopie.
Vytvoření mělké kopie je výchozím chováním metody clone () v Javě. Většinu času ale toužíme po hlubokém klonování. Při hlubokém klonování vytvoříme kopii člena objektu po členu a vytvoříme klon, který je nezávislý na původním objektu. Jakékoli změny provedené v klonovaném objektu se neprojeví v původním objektu.
Následující program Java ukazuje klonování jednorozměrného pole.
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 Výstup:

Klonovat seznam v Javě
Níže uvedený program ukazuje, jak použít metodu clone () ke klonování seznamu v Javě.
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); } }
Výstup:

Ve výše uvedeném programu vidíme, že jsme vytvořili třídu MyList, která implementuje rozhraní Cloneable, a uvnitř této třídy přepíšeme metodu clone (), která nám pomáhá klonovat List. V hlavní metodě vytvoříme seznam prvků a potom klonujeme každý prvek seznamu iterací přes seznam.
Často kladené otázky
Otázka 1) Jaké je použití rozhraní Marker v Javě?
Odpovědět: Rozhraní značek, které se také označuje jako „označené rozhraní“, označí třídu a informuje kompilátor, že tato třída může implementovat speciální chování.
Otázka 2) Co jsou všechna rozhraní Marker v Javě?
Odpovědět: Serializovatelná, klonovatelná a vzdálená jsou rozhraní, která jsou příklady značkovacích rozhraní v Javě.
Otázka č. 3) Proč je serializovatelné rozhraní značek?
Odpovědět: Serializovatelné rozhraní nemá žádné metody ani členské proměnné. Jedná se o prázdné rozhraní, které jej klasifikuje jako rozhraní značek.
Otázka č. 4) Je možné spustit Marker Interface?
Odpovědět: Ne, runnable není rozhraní značky. Rozhraní runnable není prázdné a poskytuje uvnitř něj deklaraci metody run ().
Otázka č. 5) Proč musíme implementovat Cloneable rozhraní?
Odpovědět: Implementací klonovatelného rozhraní pro třídu označujeme, že objekty této třídy lze klonovat pomocí metody clone () třídy Object. Pokud třída používající metodu clone () neimplementuje klonovatelné rozhraní, je vyvolána výjimka „CloneNotSupportedException“.
Závěr
S tímto tutoriálem jsme dokončili naši diskusi o rozhraních v Javě. Diskutovali jsme o konceptu rozhraní, jejich struktuře, definici, použití atd. Diskutovali jsme také o některých důležitých rozhraních v rozhraních Java, jako jsou srovnatelná, komparátor, značkovače atd.
V tomto tutoriálu jsme probrali dva příklady rozhraní značek, tj. Serializovatelná a klonovatelná. Serializovatelné rozhraní se používá k přetrvávání objektu. Klonovatelné rozhraní se používá ke klonování objektů třídy. Obě tato rozhraní jsou značkovací rozhraní, tj. Jsou prázdná.
Ale když je třída implementuje, pak naznačují, že kompilátor může očekávat nějaké speciální chování od tříd, které je implementují.
Například, když třída implementuje Serializovatelné rozhraní, můžeme serializovat nebo deserializovat objekty třídy a uložit / načíst jejich stav.
Třída implementující klonovatelné rozhraní naznačuje, že můžeme klonovat objekty této třídy. Výchozí implementace metody clone () vytvoří mělkou kopii objektu, zatímco můžeme metodu clone () přepsat a vytvořit tak hlubokou kopii.
=> Prozkoumejte kompletní sérii Java Training Series zde
Doporučené čtení
- Set Interface In Java: Java Set Tutorial With examples
- Rozhraní ListIterator v Javě s příklady
- Implementace Java: Vytvoření a spuštění souboru Java JAR
- A Java - a její implementace a definice
- Základy jazyka Java: Syntaxe jazyka Java, třída Java a základní koncepty Java
- Objekt Java Class Vs - Jak používat třídu a objekt v Javě
- Virtuální stroj Java: Jak JVM pomáhá při spouštění aplikace Java
- Srovnatelná a komparační rozhraní v Javě