marker interface java
W tym samouczku wyjaśniono, czym jest interfejs znaczników w języku Java. Obejmuje również deserializację i klonowanie serializacji w Javie z przykładami kodu:
Ostatni temat omówimy w części Interfaces, czyli Interfejs Markera w Javie.
Gdy skończymy z interfejsem znaczników, omówimy dwa przykłady, tj. Interfejs serializowalny i klonowalny w Javie. Zacznijmy od interfejsu Markera.
=> Odwiedź tutaj, aby nauczyć się języka Java od podstaw
Czego się nauczysz:
- Interfejs markera w Javie
- Serializacja w Javie
- Interfejs szeregowy Java
- Klonowalny interfejs w Javie
- Wniosek
Interfejs markera w Javie
Interfejs znaczników w Javie to pusty interfejs, który nie ma pól ani metod. Ten interfejs znaczników informuje kompilator, że obiekty klasy implementującej interfejs znacznika są różne i powinny być inaczej traktowane.
Każdy interfejs znacznika w Javie wskazuje, że reprezentuje coś specjalnego dla maszyny JVM lub kompilatora.
W Javie mamy trzy interfejsy, które są interfejsami Markera, jak pokazano poniżej:
# 1) Interfejs szeregowy: Serializable to interfejs znacznika obecny w pakiecie java.io. Możemy serializować obiekty za pomocą tego interfejsu, tj. Zapisać stan obiektu do pliku.
# 2) Interfejs klonowalny: Klonowalny interfejs jest częścią pakietu java.lang i umożliwia klonowanie obiektów.
# 3) Zdalny interfejs: Interfejs zdalny jest częścią pakietu java.RMI i używamy tego interfejsu do tworzenia aplikacji RMI. Ten interfejs dotyczy głównie zdalnych obiektów.
W tym samouczku omówimy interfejs możliwy do serializacji i klonowania. Interfejs zdalny zostanie omówiony, gdy przejdziemy do RMI w Javie.
darmowe oprogramowanie zegara czasu na PC
Serializacja w Javie
Zanim przejdziemy do szczegółów interfejsu serializowalnego w Javie, przyjrzyjmy się procesowi serializacji, a także deserializacji w Javie.
Serializację można zdefiniować jako proces, w którym konwertujemy stan obiektu na jego równoważny strumień bajtów, aby zapisać obiekt w pamięci w pliku lub trwać obiekt.
Kiedy chcemy odzyskać obiekt z jego zapisanego stanu i uzyskać dostęp do jego zawartości, będziemy musieli przekonwertować strumień bajtów z powrotem na rzeczywisty obiekt Java i proces ten nazywa się deserializacją.
W ten sposób może istnieć wiele przypadków, w których musimy serializować / deserializować obiekty Java w czasie życia aplikacji Java.
Proces serializacji / deserializacji przedstawiono poniżej:
Jak pokazano powyżej, serializacja konwertuje obiekt na strumień. Deserializacja konwertuje strumień bajtów z powrotem na obiekt Java.
Cały mechanizm serializacji i deserializacji jest niezależny od platformy. Oznacza to, że możemy serializować obiekt na jednej platformie, a następnie deserializować go na innej platformie.
Kiedy mówimy, że zserializowaliśmy obiekt Java, oznacza to, że wywołaliśmy metodę WriteObject () ObjectOutputStream, aby zapisać obiekt do pliku.
public final void writeObect (Object obj) zgłasza wyjątek IOException
Podobnie w przypadku deserializacji wywołujemy metodę ObjectInputStream :: readObject () w celu odczytania danych z pliku, w którym przechowywany jest obiekt.
public final Object readObject () zgłasza wyjątek IOException, ClassNotFoundException
Interfejs szeregowy Java
Java udostępnia interfejs o nazwie „serializable”, za pomocą którego możemy zaimplementować serializację i deserializację w Javie.
Interfejs szeregowy jest częścią pakietu java.io. Jest to przykład interfejsu znacznika, który omówiliśmy powyżej i 0, który nie ma metod ani elementów członkowskich. Interfejs możliwy do serializacji „zaznacza” klasy Java, dzięki czemu obiekty tych klas mogą same się utrwalać.
Zatem klasa, której obiekt musimy utrwalić, powinna implementować interfejs Serializable. Następnie obiekt tej klasy (implementujący interfejs Serializable) użyje odpowiednio metod writeObject () i readObject () do serializacji i deserializacji obiektu klasy.
Zauważ, że wszystkie klasy opakowania i klasa String domyślnie implementują java.io.Serializable.
Aby obiekt został pomyślnie serializowany, powinniśmy spełnić następujący warunek:
- Klasa, której obiekty są serializowane, musi implementować interfejs java.io.Serializable.
- Wszystkie pola członkowskie klasy muszą mieć możliwość serializacji. Jeśli dane pole nie nadaje się do serializacji, powinniśmy oznaczyć je jako przejściowe.
I odwrotnie, klasa jest możliwa do serializacji tylko wtedy, gdy implementuje interfejs java.io.Serializable, w przeciwnym razie nie jest możliwa do serializacji.
Jak serializować i deserializować obiekt w Javie
Kiedy serializujemy obiekt w Javie, używamy metody writeObject obiektu objectOutputStream do zapisania obiektu do pliku.
Do deserializacji obiektu w Javie używamy metody readObject () ObjectInputStream, aby odczytać zawartość pliku i wczytać ją do obiektu.
W tym przykładzie mamy klasę Student, która implementuje interfejs Serializable. Oznacza to, że możemy serializować lub deserializować obiekty klasy Student.
W głównej metodzie programu Java tworzymy obiekt klasy Student. Następnie tworzymy ObjectOutputStream, który wskazuje na obiekt FileOutputStream, który z kolei wskazuje na plik, w którym musimy zapisać obiekt Student. Następnie wywołujemy metodę writeObject (), która zapisuje obiekt do pliku.
Po pomyślnym zapisaniu określonego obiektu do określonego pliku program wyświetla odpowiedni komunikat wyjściowy. Następnie deserializujemy obiekt, odwracając powyższy proces. Najpierw tworzymy obiekt ObjectOutputStream, w którym czytamy plik, którego zawartość ma zostać odczytana.
Następnie używamy metody readObject (), aby odczytać zawartość i rzutować ją na obiekt Student. Następnie drukujemy zawartość obiektu Student.
Przykład serializacji / deserializacji
Poniższy program w języku Java przedstawia mechanizm serializacji / deserializacji w języku Java, jak omówiono powyżej.
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);} } }
Wynik:
Zauważ, że po deserializacji otrzymujemy ten sam obiekt, który serializowaliśmy wcześniej, gdy ponownie otwieramy ten sam plik.
Przejściowe słowo kluczowe Java
Słowo kluczowe transient jest używane, aby uczynić element członkowski danych przejściowym, tj. Nie chcemy go serializować.
Na przykład, rozważ następującą klasę Pracownik. Tutaj mamy pole ID pracownika wraz z innymi polami. Jeśli teraz zdecydujemy, że pole Identyfikator pracownika nie powinno być serializowane, deklarujemy je jako „przejściowe”.
Przykładowy program w języku Java jest podany poniżej.
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);} } }
Wynik:
W powyższym programie zserializowaliśmy obiekt Pracownik. Należy jednak zauważyć, że pole Identyfikator pracownika w klasie Pracownik jest zadeklarowane jako „przejściowe”. Teraz, aby sprawdzić serializację, deserializujemy obiekt. Dane wyjściowe przedstawiają obiekt pracownika jako „0 Eddie”. Oznacza to, że identyfikator pracownika nie został zapisany w pliku.
Java.io.NotSerializableException W Javie
Wyjątek java.io.NotSerializableException to wyjątek, który jest generowany, gdy klasa nie kwalifikuje się do serializacji. Klasa, która nie implementuje interfejsu Serializable, nie kwalifikuje się do serializacji.
Poniższy program Java przedstawia wyjątek 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);} } }
Wynik:
Jak widać z powyższego programu, klasa Employee nie implementuje interfejsu Serializable. W związku z tym podczas próby serializacji obiektu klasy Employee generowany jest wyjątek NotSerializableException.
Klonowalny interfejs w Javie
Klonowanie obiektów oznacza tworzenie kopii obiektów. Java obsługuje klonowanie obiektów przy użyciu „ Klonowalne ”Interfejs. Interfejs, który można sklonować, jest interfejsem znaczników i jest częścią pakietu java.lang.
jaki jest najlepszy środek do usuwania wirusów
Kiedy klasa implementuje interfejs Cloneable, oznacza to, że możemy klonować obiekty tej klasy. Klasa Object języka Java zawiera „ klon ()' metoda. Zatem interfejs Cloneable implementowany przez określoną klasę autoryzuje metodę clone () do tworzenia kopii instancji klas.
Jeśli klasa nie implementuje interfejsu Cloneable i nadal wywołuje metodę clone (), wyjątek CloneNotSupportedException jest generowany przez kompilator języka Java.
Klasy implementujące interfejs Cloneable powinny przesłonić metodę clone ().
Więc co to jest klonowanie obiektów?
Klonowanie obiektu to proces, za pomocą którego tworzymy dokładną kopię obiektu za pomocą metody clone () klasy Object. Aby metoda clone () została zastąpiona i wywołana, klasa musi zaimplementować interfejs Cloneable.
Ogólna składnia metody clone () jest podana poniżej:
chroniony Klon obiektu () rzuca CloneNotSupportedException
Metoda clone () tworzy dokładną kopię obiektu przy mniejszym czasie przetwarzania niż w przypadku tworzenia nowego obiektu przy użyciu słowa kluczowego new.
Poniższy program w języku Java demonstruje użycie metody clone () i interfejsu 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){} } }
Wynik:
W tym programie mamy klasę Student implementującą interfejs Cloneable. Zastępuje również metodę clone (), wywołując metodę super.clone (). W metodzie głównej tworzymy nowy obiekt Studenta, a następnie wywołujemy na tym obiekcie metodę clone (), która zwraca nowy obiekt Studenta.
Klonuj tablicę w Javie
Omówiliśmy klonowanie tablic w naszym samouczku dotyczącym tablic. Ponieważ tablice Java domyślnie implementują interfejs Cloneable, nie muszą być jawnie implementowane. Po sklonowaniu jednowymiarowej tablicy generowana jest głęboka kopia tablicy. Kiedy sklonowana jest dwuwymiarowa tablica, tworzona jest płytka kopia.
Tworzenie płytkiej kopii jest domyślnym zachowaniem metody clone () w Javie. Ale przez większość czasu pragniemy głębokiego klonowania. W przypadku głębokiego klonowania tworzymy kopię elementu obiektu po elemencie i tworzymy klon, który jest niezależny od oryginalnego obiektu. Wszelkie zmiany wprowadzone w sklonowanym obiekcie nie zostaną odzwierciedlone w oryginalnym obiekcie.
Poniższy program w języku Java przedstawia klonowanie jednowymiarowej tablicy.
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 Wynik:
Klonuj listę w Javie
Poniższy program pokazuje, jak użyć metody clone () do sklonowania listy w Javie.
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); } }
Wynik:
W powyższym programie widzimy, że utworzyliśmy klasę MyList, która implementuje interfejs Cloneable i wewnątrz tej klasy nadpisujemy metodę clone (), która pomaga nam sklonować List. W metodzie głównej tworzymy listę elementów, a następnie klonujemy każdy element listy, wykonując iterację po liście.
Często Zadawane Pytania
Pytanie 1) Jakie jest zastosowanie interfejsu Marker w Javie?
Odpowiedź: Interfejs znacznika, znany również jako „interfejs ze znacznikiem”, oznacza klasę i informuje kompilator, że ta klasa może zaimplementować specjalne zachowanie.
Pytanie 2) Jakie są wszystkie interfejsy markerów w Javie?
Odpowiedź: Serializable, Cloneable i Remote to interfejsy, które są przykładami interfejsów znaczników w Javie.
Pytanie 3) Dlaczego można serializować interfejs znacznika?
Odpowiedź: Interfejs możliwy do serializacji nie ma żadnych metod ani zmiennych składowych. Jest to pusty interfejs, który klasyfikuje go jako interfejs markera.
P # 4) Czy można uruchomić interfejs markera?
Odpowiedź: Nie, runnable nie jest interfejsem znacznika. Interfejs, który można uruchomić, nie jest pusty i zawiera deklarację metody run ().
jak otworzyć plik .jar za pomocą java
Pytanie 5) Dlaczego musimy wdrożyć interfejs klonowalny?
Odpowiedź: Implementując klonowalny interfejs dla klasy, wskazujemy, że obiekty tej klasy mogą być klonowane za pomocą metody clone () klasy Object. Jeśli klasa korzystająca z metody clone () nie implementuje klonowalnego interfejsu, generowany jest wyjątek „CloneNotSupportedException”.
Wniosek
W tym samouczku zakończyliśmy dyskusję na temat interfejsów w Javie. Omówiliśmy koncepcję interfejsów, ich strukturę, definicję, zastosowanie itp. Omówiliśmy także niektóre z ważnych interfejsów w interfejsach porównywalnych z Javą, komparatora, markerów itp.
W tym samouczku omówiliśmy dwa przykłady interfejsów znaczników, tj. Serializowalnych i klonowalnych. Interfejs możliwy do serializacji służy do utrwalania obiektu. Klonowalny interfejs służy do klonowania obiektów klas. Oba te interfejsy są interfejsami znaczników, tj. Są puste.
Ale kiedy klasa je implementuje, wskazują, że kompilator może oczekiwać specjalnego zachowania od klas implementujących je.
Na przykład, gdy klasa implementuje interfejs Serializable, możemy serializować lub deserializować obiekty klasy i zapisywać / pobierać ich stan.
Klasa implementująca klonowalny interfejs wskazuje, że możemy klonować obiekty tej klasy. Domyślna implementacja metody clone () tworzy płytką kopię obiektu, podczas gdy możemy przesłonić metodę clone (), aby utworzyć głęboką kopię.
=> Zapoznaj się z pełną serią szkoleń dotyczących języka Java
rekomendowane lektury
- Ustaw interfejs w języku Java: samouczek dotyczący zestawu Java z przykładami
- Interfejs ListIterator w Javie z przykładami
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- A Java - i jej implementacja i definicje
- Podstawy języka Java: składnia języka Java, klasa języka Java i podstawowe pojęcia dotyczące języka Java
- Obiekt klasy Java Vs - jak używać klasy i obiektu w języku Java
- Wirtualna maszyna Java: jak JVM pomaga w uruchamianiu aplikacji Java
- Porównywalne i porównawcze interfejsy w Javie