marker interface java
Този урок обяснява какво е интерфейс за маркиране в Java. Той също така обхваща десериализацията и клонирането на сериализация в Java с примери за код:
Ще обсъдим последната тема под Интерфейси, т.е.Маркерен интерфейс в Java.
След като приключим с маркерния интерфейс, ще обсъдим два примера, т.е. сериализуем и клонируем интерфейс в Java. Нека започнем с интерфейса Marker.
=> Посетете тук, за да научите Java от нулата
Какво ще научите:
- Интерфейс на маркер в Java
- Сериализация в Java
- Java сериализуем интерфейс
- Cloneable интерфейс в Java
- Заключение
Интерфейс на маркер в Java
Интерфейсът на маркер в Java е празен интерфейс, който няма полета или методи. Този интерфейс на маркер казва на компилатора, че обектите от класа, които реализират интерфейса на маркера, са различни и че трябва да се третират по различен начин.
Всеки интерфейс на маркер в Java показва, че представлява нещо специално за JVM или компилатор.
В Java имаме три интерфейса, които са интерфейси Marker, както е показано по-долу:
# 1) Сериализуем интерфейс: Serializable е маркер интерфейс, присъстващ в пакета java.io. Можем да сериализираме обекти, използвайки този интерфейс, т.е.записваме състоянието на обекта във файл.
# 2) Cloneable интерфейс: Клониращият интерфейс е част от пакета java.lang и позволява клонирането на обектите.
# 3) Отдалечен интерфейс: Отдалеченият интерфейс е част от пакета java.RMI и ние използваме този интерфейс за създаване на RMI приложения. Този интерфейс се занимава главно с отдалечени обекти.
В този урок ще обсъдим сериализиращия се и клонируем интерфейс. Дистанционният интерфейс ще бъде обсъден, когато преминем към RMI в Java.
Сериализация в Java
Преди да влезем в подробностите за сериализиращия се интерфейс в Java, нека разберем процеса на сериализация, както и десериализация в Java.
Сериализацията може да бъде дефинирана като процес, чрез който преобразуваме състоянието на обекта в еквивалентния му байтов поток, за да съхраним обекта в паметта във файл или упорствам предметът.
Когато искаме да извлечем обекта от запазеното му състояние и да осъществим достъп до съдържанието му, ще трябва да преобразуваме байтовия поток обратно в действителния Java обект и този процес се нарича десериализация.
По този начин може да има много случаи, в които трябва да сериализираме / десериализираме Java обекти в цял живот на Java приложението.
Процесът на сериализация / десериализация е показан по-долу:
Както е показано по-горе, сериализацията преобразува обекта в поток. Десериализацията преобразува байтовия поток обратно в Java обект.
Целият механизъм на сериализация и десериализация е независим от платформата. Това означава, че можем да сериализираме обекта на една платформа и след това да го десериализираме на друга платформа.
Когато казваме, че сме сериализирали обекта Java, това означава, че сме извикали метода ObjectOutputStream writeObject (), за да запишем обекта във файл.
безплатно приложение за изтегляне на mp3 за телефон с Android
public final void writeObect (Object obj) хвърля IOException
По същия начин, в случай на десериализация, извикваме метода ObjectInputStream :: readObject (), за да прочетем данните от файла, който е съхранил обекта.
публичен окончателен обект readObject () хвърля IOException, ClassNotFoundException
Java сериализуем интерфейс
Java предоставя интерфейс, наречен „сериализуем“, с помощта на който можем да реализираме сериализация и десериализация в Java.
Сериализиращият се интерфейс е част от пакета java.io. Това е пример за интерфейс на маркер, който обсъдихме по-горе и0, който няма методи или членове. Сериализиращият се интерфейс ‘маркира’ Java класовете, така че обектите на тези класове да получат способността да се персистират.
Така че класът, чийто обект трябва да запазим, трябва да реализира сериализуем интерфейс. Тогава обектът на този клас (реализиращ сериализуем интерфейс) ще използва методите writeObject () и readObject () съответно за сериализиране и десериализиране на обекта на класа.
Имайте предвид, че всички класове обвивки и класът String изпълняват java.io.Serializable по подразбиране.
Трябва да изпълним следното условие, за да бъде обектът успешно сериализиран:
- Класът, чиито обекти са сериализирани, трябва да реализира интерфейс java.io.Serializable.
- Всички полета-членове на класа трябва да могат да се сериализират. Ако дадено поле не е сериализуемо, трябва да го маркираме като преходно.
И обратно, клас е сериализуем само ако реализира интерфейса java.io.Serializable, в противен случай не е сериализуем.
Как да сериализирам и десериализирам обект в Java
Когато сериализираме обект в Java, използваме метода writeObject на objectOutputStream, за да запишем обекта във файл.
За десериализиране на обекта в Java използваме метода readObject () на ObjectInputStream, за да прочетем съдържанието на файла и да го прочетем в обект.
В този пример имаме клас Student, който реализира интерфейса Serializable. Това означава, че можем да сериализираме или десериализираме обектите от класа Student.
В основния метод на програмата Java създаваме обект на клас Student. След това създаваме ObjectOutputStream, който сочи към обект FileOutputStream, който от своя страна сочи към файл, в който трябва да напишем обекта Student. След това извикваме метода writeObject (), който записва обекта във файла.
При успешно записване на посочения обект в посочения файл, програмата дава подходящо изходно съобщение. След това десериализираме обекта чрез обръщане на горния процес. Първо създаваме обект ObjectOutputStream, в който четем файла, чието съдържание трябва да бъде прочетено.
След това използваме метода readObject (), за да прочетем съдържанието и да го прехвърлим към обекта Student. След това отпечатваме съдържанието на обекта Student.
Пример за сериализация / десериализация
Следващата програма на Java показва механизма за сериализация / десериализация в Java, както е обсъдено по-горе.
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);} } }
Изход:
Имайте предвид, че след десериализацията получаваме същия обект, който сме сериализирали по-рано, когато отваряме същия файл отново.
Преходна ключова дума на Java
Преходна ключова дума се използва, за да направи член на данни преходен, т.е.не искаме да го сериализираме.
Например, помислете за следния клас Служител. Тук имаме полето Id на служителя заедно с останалите полета. Сега, ако решим, че полето Employee Id не трябва да се сериализира, тогава го декларираме като „преходно“.
Примерна програма за Java е дадена по-долу.
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);} } }
Изход:
В горната програма сме сериализирали обекта Employee. Но имайте предвид, че полето за идентификация на служителя на класа „Служител“ е обявено за „преходно“. Сега, за да проверим сериализацията, десериализираме обекта. Резултатът показва обекта Employee като ‘0 Eddie’. Това означава, че идентификаторът на служителя не е бил запазен във файла.
Java.io.NotSerializableException В Java
Изключението на java.io.NotSerializableException е изключение, което се изхвърля, когато класът не отговаря на условията за сериализация. Класът, който не изпълнява сериализуемия интерфейс, става недопустим за сериализация.
Долната програма Java демонстрира 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);} } }
Изход:
Както се вижда от горната програма, класът Employee не прилага сериализуем интерфейс. Следователно, когато се опитваме да сериализираме обекта на класа Employee, се хвърля NotSerializableException.
Cloneable интерфейс в Java
Клонирането на обекти означава да се направи копие на обектите. Java поддържа клониране на обекти с помощта на “ Cloneable ”Интерфейс. Клониращият интерфейс е интерфейс на маркер и е част от пакета java.lang.
Когато клас реализира интерфейса Cloneable, това означава, че можем да клонираме обектите от този клас. Класът Object на Java съдържа „ клон () ’Метод. Така Cloneable интерфейсът, реализиран от определен клас, упълномощава метода clone () да прави копия на екземпляри на класа.
Ако клас не реализира интерфейс Cloneable и все още извиква метода clone (), тогава изключението CloneNotSupportedException се изхвърля от компилатора на Java.
Класовете, изпълняващи интерфейса Cloneable, трябва да отменят метода clone ().
И така, какво е клонирането на обекти?
Клонирането на обект е процес, чрез който създаваме точно копие на обекта, използвайки метода clone () от класа Object. За да бъде заменен и извикан методът clone (), класът трябва да внедри интерфейса Cloneable.
Общият синтаксис на метода clone () е даден по-долу:
защитен Клон на обект () хвърля CloneNotSupportedException
Методът clone () създава точно копие на обекта с по-малко време за обработка от това, необходимо за създаване на нов обект с помощта на новата ключова дума.
Долната програма Java демонстрира използването на метода clone () и интерфейса 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){} } }
Изход:
В тази програма имаме студентски клас, изпълняващ интерфейса Cloneable. Той също така отменя метода clone (), като извиква метода super.clone (). В основния метод създаваме нов студентски обект и след това извикваме метода clone () за този обект, който връща новия студентски обект.
Клониране на масив в Java
Проучихме клонирането на масиви в нашия урок за масиви. Тъй като масивите Java изпълняват Cloneable интерфейс по подразбиране, те не трябва да се прилагат изрично. Когато едномерният масив е клониран, се генерира дълбоко копие на масива. Когато се клонира двуизмерен масив, се прави плитко копие.
Правенето на плитко копие е поведението по подразбиране на метода clone () в Java. Но през повечето време ние желаем дълбоко клониране. При дълбоко клониране ние правим копие на обекта член по член и създаваме клонинг, който е независим от оригиналния обект. Всички промени, направени в обекта на клониране, няма да се отразят в оригиналния обект.
Следващата програма Java показва клонирането на едномерен масив.
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 Изход:

Клониране на списък в Java
Програмата по-долу показва как да използвате метод clone () за клониране на списък в 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); } }
Изход:

В горната програма виждаме, че сме създали клас MyList, който реализира интерфейса Cloneable и вътре в този клас заместваме метода clone (), който ни помага да клонираме списъка. В основния метод създаваме списък с елементи и след това клонираме всеки елемент от списъка чрез итерация върху списъка.
често задавани въпроси
Q # 1) Каква е ползата от Marker Interface в Java?
Отговор: Интерфейсът на маркер, който е известен също като „тагиран интерфейс“, маркира класа и информира компилатора, че този клас може да реализира специално поведение.
В # 2) Какви са всички интерфейси за маркиране в Java?
Отговор: Сериализуеми, клонируеми и отдалечени са интерфейсите, които са примерите за маркерни интерфейси в Java.
В # 3) Защо сериализуемият маркер интерфейс?
Отговор: Интерфейсът, който може да се сериализира, няма никакви методи или променливи на членове. Това е празен интерфейс, който го класифицира като маркер интерфейс.
В # 4) Може ли да се управлява маркер интерфейс?
Отговор: Не, runnable не е интерфейс за маркери. Изпълняваният интерфейс не е празен и той осигурява декларация за метод run () вътре в него.
Въпрос # 5) Защо трябва да внедрим Cloneable интерфейс?
Отговор: Чрез внедряване на клонируем интерфейс за клас, ние посочваме, че обектите от този клас могат да бъдат клонирани, използвайки метода clone () на класа Object. Ако клас, използващ метода clone (), не реализира клонируем интерфейс, тогава се хвърля изключението „CloneNotSupportedException“.
Заключение
С този урок завършихме дискусията си относно Интерфейси в Java. Обсъдихме концепцията за интерфейсите, тяхната структура, дефиниция, използване и др. Обсъдихме и някои от важните интерфейси в подобни на Java интерфейси Comparable, Comparator, Marker и т.н.
В този урок обсъдихме два примера за интерфейси на маркери, т.е.сериализуем и клонируем. За персистиране на обект се използва сериализуем интерфейс. Клониращият интерфейс се използва за клониране на обектите на класа. И двата интерфейса са интерфейси с маркери, т.е.празни.
Но когато даден клас ги изпълнява, те показват, че компилаторът може да очаква някакво специално поведение от класовете, които ги изпълняват.
Например, когато клас реализира сериализуем интерфейс, тогава можем да сериализираме или десериализираме обектите на класа и да запазим / извлечем тяхното състояние.
Клас, изпълняващ клонируем интерфейс, показва, че можем да клонираме обектите от този клас. Изпълнението по подразбиране на метода clone () създава плитко копие на обекта, докато можем да заменим метода clone (), за да създадем дълбоко копие.
=> Разгледайте пълната серия за обучение по Java тук
Препоръчително четене
- Задаване на интерфейс в Java: Урок за задаване на Java с примери
- ListIterator интерфейс в Java с примери
- Разполагане на Java: Създаване и изпълнение на Java JAR файл
- И Java - и нейното изпълнение и определения
- Основи на Java: Синтаксис на Java, клас Java и основни концепции на Java
- Java Class Vs Object - Как да използвам класа и обекта в Java
- Java виртуална машина: Как JVM помага при стартирането на Java приложение
- Сравними и сравнителни интерфейси в Java