marker interface java
Acest tutorial explică ce este o interfață Marker în Java. De asemenea, acoperă Serializarea Deserializarea și Clonarea în Java cu exemple de cod:
Vom discuta ultimul subiect sub Interfețe, adică Marker Interface în Java.
După ce am terminat cu interfața marker, vom discuta două exemple, adică interfața serializabilă și clonabilă în Java. Să începem cu interfața Marker.
=> Vizitați aici pentru a afla Java de la zero
Ce veți învăța:
- Interfață Marker în Java
- Serializare în Java
- Interfață serializabilă Java
- Interfață clonabilă în Java
- Concluzie
Interfață Marker în Java
O interfață marker în Java este o interfață goală care nu are câmpuri sau metode. Această interfață marker îi spune compilatorului că obiectele clasei care implementează interfața marker sunt diferite și că ar trebui tratate diferit.
Fiecare interfață de marker din Java indică faptul că reprezintă ceva special pentru JVM sau compilator.
În Java, avem trei interfețe care sunt interfețe Marker așa cum se arată mai jos:
# 1) Interfață serializabilă: Serializabil este o interfață de marker prezentă în pachetul java.io. Putem serializa obiecte folosind această interfață, adică salvăm starea obiectului într-un fișier.
# 2) Interfață clonabilă: Interfața clonabilă face parte din pachetul java.lang și permite clonarea obiectelor.
# 3) Interfață la distanță: Interfața la distanță face parte din pachetul java.RMI și folosim această interfață pentru a crea aplicații RMI. Această interfață se ocupă în principal de obiecte la distanță.
În acest tutorial, vom discuta despre interfața serializabilă și clonabilă. Interfața la distanță va fi discutată atunci când trecem la RMI în Java.
Serializare în Java
Înainte de a intra în detaliile interfeței serializabile în Java, să înțelegem procesul de serializare, precum și deserializarea în Java.
Serializarea poate fi definită ca un proces prin care convertim starea obiectului în fluxul său de octeți echivalent pentru a stoca obiectul în memorie într-un fișier sau persista obiectul.
Când vrem să recuperăm obiectul din starea sa salvată și să accesăm conținutul acestuia, va trebui să convertim fluxul de octeți înapoi în obiectul Java real și acest proces se numește deserializare.
În acest fel pot exista multe cazuri în care trebuie să serializăm / deserializăm obiecte Java într-o viață de aplicație Java.
Procesul de serializare / deserializare este prezentat mai jos:
După cum se arată mai sus, serializarea convertește obiectul într-un flux. Deserializarea convertește fluxul de octeți înapoi într-un obiect Java.
Întregul mecanism de serializare și deserializare este independent de platformă. Aceasta înseamnă că putem serializa obiectul pe o platformă și apoi îl putem deserializa pe altă platformă.
Când spunem că am serializat obiectul Java, înseamnă că am apelat la metoda ObjectOutputStream writeObject () pentru a scrie obiectul într-un fișier.
cel mai bun software gratuit de backup pentru imagini 2017
public final void writeObect (obiect obiect) aruncă IOException
În mod similar, în cazul deserializării, apelăm metoda ObjectInputStream :: readObject () pentru a citi datele din fișierul care a stocat obiectul.
public final Object readObject () aruncă IOException, ClassNotFoundException
Interfață serializabilă Java
Java oferă interfața denumită „serializabilă” folosind care putem implementa serializarea și deserializarea în Java.
Interfața serializabilă face parte din pachetul java.io. Este un exemplu de interfață de marker despre care am discutat mai sus și 0 care nu are metode sau membri. Interfața serializabilă „marchează” clasele Java astfel încât obiectele acestor clase să capete să persiste.
Deci, clasa al cărei obiect trebuie să persistăm ar trebui să implementeze interfața Serializable. Apoi obiectul acestei clase (implementarea interfeței Serializable) va folosi metode writeObject () și readObject () respectiv pentru serializarea și deserializarea obiectului clasei.
Rețineți că toate clasele wrapper și clasa String implementează java.io.Serializable în mod implicit.
Ar trebui să îndeplinim următoarele condiții pentru ca un obiect să fie serializat cu succes:
- Clasa ale cărei obiecte sunt serializate trebuie să implementeze interfața java.io.Serializable.
- Toate câmpurile membre ale clasei trebuie să fie serializabile. Dacă un anumit câmp nu este serializabil, atunci ar trebui să îl marcăm ca tranzitoriu.
În schimb, o clasă este serializabilă numai dacă implementează interfața java.io.Serializable, altfel nu este serializabilă.
Cum se serializează și se deserializează un obiect în Java
Când serializăm un obiect în Java, folosim metoda writeObject a objectOutputStream pentru a scrie obiectul într-un fișier.
Pentru deserializarea obiectului în Java, folosim metoda readObject () a ObjectInputStream pentru a citi conținutul fișierului și a le citi într-un obiect.
În acest exemplu, avem o clasă Student care implementează interfața serializabilă. Aceasta înseamnă că putem serializa sau deserializa obiectele clasei Student.
În metoda principală a programului Java, creăm un obiect de clasă Student. Apoi creăm un ObjectOutputStream care indică un obiect FileOutputStream care la rândul său indică un fișier în care trebuie să scriem obiectul Student. Apoi numim metoda writeObject () care scrie obiectul în fișier.
La scrierea cu succes a obiectului specificat în fișierul specificat, programul dă un mesaj de ieșire adecvat. Apoi deserializăm obiectul inversând procesul de mai sus. Mai întâi, creăm un obiect ObjectOutputStream în care citim fișierul al cărui conținut trebuie citit.
Apoi folosim metoda readObject () pentru a citi conținutul și a-l arunca în obiectul Student. Apoi imprimăm conținutul obiectului Student.
Exemplu de serializare / deserializare
Următorul program Java prezintă mecanismul de serializare / deserializare în Java așa cum s-a discutat mai sus.
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);} } }
Ieșire:
Rețineți că, după deserializare, obținem același obiect pe care l-am serializat mai devreme, deoarece deschidem din nou același fișier.
Cuvânt cheie tranzitorie Java
Un cuvânt cheie tranzitoriu este folosit pentru a face un membru de date tranzitoriu, adică nu dorim să îl serializăm.
De exemplu, ia în considerare următoarea clasă Angajat. Aici avem câmpul Id al angajaților împreună cu celelalte câmpuri. Acum, dacă decidem că câmpul Id angajat nu trebuie serializat, îl declarăm ca „tranzitoriu”.
Un exemplu de program Java este dat mai jos.
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);} } }
Ieșire:
În programul de mai sus, am serializat obiectul Angajat. Rețineți însă că câmpul de identificare a angajaților din clasa Angajați este declarat „tranzitoriu”. Acum, pentru a verifica serializarea, deserializăm obiectul. Ieșirea arată obiectul Angajat ca „0 Eddie”. Aceasta înseamnă că ID-ul angajatului nu a fost salvat în fișier.
Java.io.NotSerializableException În Java
Excepția java.io.NotSerializableException este o excepție care este aruncată atunci când clasa nu este eligibilă pentru serializare. Clasa care nu implementează interfața Serializable devine neeligibilă pentru serializare.
Programul Java de mai jos demonstrează 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);} } }
Ieșire:
După cum se vede din programul de mai sus, clasa Angajați nu implementează interfața serializabilă. Prin urmare, atunci când încercăm să serializăm obiectul clasei Employee, este aruncată NotSerializableException.
Interfață clonabilă în Java
Clonarea obiectelor înseamnă realizarea unei copii a obiectelor. Java acceptă clonarea obiectelor folosind „ Clonabil ”Interfață. Interfața clonabilă este o interfață de marcare și face parte din pachetul java.lang.
Când o clasă implementează interfața Cloneable, atunci aceasta implică faptul că putem clona obiectele acestei clase. Clasa Object a Java conține „ clona () ’Metodă. Deci, interfața clonabilă implementată de o anumită clasă autorizează metoda clone () să facă copii ale instanțelor clasei.
Dacă o clasă nu implementează o interfață clonabilă și totuși invocă metoda clone (), atunci excepția CloneNotSupportedException este aruncat de compilatorul Java.
Clasele care implementează interfața Cloneable ar trebui să înlocuiască metoda clone ().
Deci, ce este clonarea obiectelor?
Clonarea obiectelor este un proces prin care creăm o copie exactă a obiectului folosind metoda clone () din clasa Object. Pentru ca metoda clone () să fie suprascrisă și invocată, clasa trebuie să implementeze interfața Cloneable.
Sintaxa generală a metodei clone () este dată mai jos:
protejat Clonare obiect () aruncă CloneNotSupportedException
Metoda clone () creează o copie exactă a obiectului cu un timp de procesare mai mic decât cel necesar pentru crearea unui nou obiect folosind noul cuvânt cheie.
Programul Java de mai jos demonstrează utilizarea metodei clone () și a interfeței 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){} } }
Ieșire:
În acest program, avem o clasă Student care implementează interfața Cloneable. De asemenea, suprascrie metoda clone () apelând metoda super.clone (). În metoda principală creăm un nou obiect Student și apoi apelăm metoda clone () pe acest obiect care returnează noul obiect Student.
Clone Array În Java
Am explorat clonarea matricelor în tutorialul nostru despre matrice. Deoarece matricile Java implementează interfața clonabilă în mod implicit, acestea nu trebuie să fie implementate în mod explicit. Când matricea unidimensională este clonată, se generează o copie profundă a matricei. Când o matrice bidimensională este clonată, atunci se face o copie superficială.
Efectuarea unei copii superficiale este comportamentul implicit al metodei clone () în Java. Dar de cele mai multe ori dorim clonarea profundă. În clonarea profundă, facem o copie a obiectului membru cu membru și creăm o clonă care este independentă de obiectul original. Orice modificare făcută apoi obiectului clonat nu se va reflecta în obiectul original.
Următorul program Java arată clonarea unui tablou unidimensional.
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 Ieșire:
Lista de clonare în Java
Programul de mai jos arată cum să utilizați o metodă clone () pentru a clona o listă în 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); } }
Ieșire:
În programul de mai sus, vedem că am creat o clasă MyList care implementează interfața Cloneable și, în interiorul acestei clase, înlocuim metoda clone () care ne ajută să clonăm Lista. În metoda principală, creăm o listă de elemente și apoi clonăm fiecare element al listei prin iterarea peste listă.
întrebări frecvente
Q # 1) La ce folosește Marker Interface în Java?
Răspuns: Interfața Marker, cunoscută și sub numele de „interfață etichetată”, etichetează clasa și informează compilatorul că această clasă poate implementa un comportament special.
Q # 2) Care sunt toate interfețele Marker din Java?
Răspuns: Serializabile, clonabile și la distanță sunt interfețele care sunt exemple de interfețe de marker în Java.
Î. # 3) De ce este serializabilă o interfață Marker?
Răspuns: Interfața serializabilă nu are metode sau variabile membre. Este o interfață goală care o clasifică ca Interfață Marker.
Q # 4) Este rulabil o interfață Marker?
Răspuns: Nu, runnable nu este o interfață marker. Interfața rulabilă nu este goală și oferă o declarație de metodă run () în interiorul ei.
Q # 5) De ce trebuie să implementăm o interfață clonabilă?
Răspuns: Prin implementarea unei interfețe clonabile pentru o clasă, indicăm că obiectele acestei clase pot fi clonate folosind metoda clone () a clasei Object. Dacă o clasă care folosește metoda clone () nu implementează o interfață clonabilă, atunci se lansează excepția „CloneNotSupportedException”.
Concluzie
Cu acest tutorial, am finalizat discuția noastră despre interfețele în Java. Am discutat conceptul de interfețe, structura, definiția, utilizarea acestora etc. Am discutat, de asemenea, unele dintre interfețele importante în interfețele comparabile, comparatoare, Marker etc.
În acest tutorial, am discutat două exemple de interfețe de marker, adică serializabile și clonabile. O interfață serializabilă este utilizată pentru a persista un obiect. Interfața clonabilă este utilizată pentru clonarea obiectelor clasei. Ambele interfețe sunt interfețe marker, adică sunt goale.
Dar când o clasă le implementează, atunci acestea indică faptul că compilatorul se poate aștepta la un anumit comportament special de la clasele care le implementează.
De exemplu, când o clasă implementează o interfață serializabilă, atunci putem serializa sau deserializa obiectele clasei și le putem salva / prelua starea.
O clasă care implementează o interfață clonabilă indică faptul că putem clona obiectele acestei clase. Implementarea implicită a metodei clone () creează o copie superficială a obiectului, în timp ce putem suprascrie metoda clone () pentru a crea o copie profundă.
=> Explorați aici seria completă de antrenament Java
Lectură recomandată
- Setați interfața în Java: Tutorial de setare Java cu exemple
- Interfață ListIterator în Java cu exemple
- Implementarea Java: crearea și executarea fișierului Java JAR
- Și Java - și implementarea și definițiile sale
- Noțiuni de bază Java: Sintaxă Java, Java Class și Core Java Concepts
- Obiectul Java Class Vs - Cum se utilizează clasa și obiectul în Java
- Mașină virtuală Java: Cum ajută JVM la rularea aplicației Java
- Interfețe comparabile și comparatoare în Java