#java #исключения #наследование #сериализация #десериализация
Есть классы, расположенные в определённой иерархии наследования:
public class Program {
public Program(){
System.out.println("Текст");
}
}
public class Wild extends Program{
public Wild(){
System.out.println("НеТекст");
}
}
public class BasicProgramists extends Wild{
public BasicProgramists(){
System.out.println("Бесполезная программа");
}
}
import java.io.*;
public class BasicUser extends BasicProgramists implements Serializable {
public BasicUser(){
System.out.println("Использование бесполезной программы");
}
public static void main(String[] args) {
BasicUser user = new BasicUser();
System.out.println();
try {
ObjectOutputStream or = new ObjectOutputStream(new FileOutputStream("Progg.ser"));
or.writeObject(user);
or.close();
}
catch (IOException ex){
ex.printStackTrace();
}
try {
ObjectInputStream is = new ObjectInputStream(new FileInputStream("Progg.ser"));
BasicUser user1 = (BasicUser) is.readObject();
}
catch (Exception ex){
ex.printStackTrace();
}
}
}
После компиляции получаем вот такой результат:
До отступа - результат работы конструктора BasicUser
После отступа - результат работы десериализации
Скажите, пожалуйста, почему в результате десириализации, программа не выводит на
экран результат работы конструктора BasicUser, хотя выводит результат работы всех родительских
классов?
Ответы
Ответ 1
Сериализация в java не использует конструкторы для создания объектов. Поэтому контруктор не был вызван. Но почему вызвались кострукторы родительских классов? Очевидно, т.к. они не реализовали Serializable, то механизм сериализации о них ничего не знал и поэтому инициализация происходила обычным способом - через конструктор. В сказаном легко убедиться реализовав Serializable классом Program.Ответ 2
В дополнение к предыдущему ответу Если нужно, чтобы все конструкторы отрабатывали Немного допилил ваш код import java.io.*; class Program { Program() { System.out.println("Текст"); } } class Wild extends Program { Wild() { System.out.println("НеТекст"); } } class BasicProgrammers extends Wild { BasicProgrammers() { System.out.println("Бесполезная программа"); } } class BasicUser extends BasicProgrammers { BasicUser() { System.out.println("Использование бесполезной программы"); } } class SuperUser extends BasicUser implements Serializable { public static void main(String[] args) { SuperUser superUser = new SuperUser(); System.out.println(); try { ObjectOutputStream or = new ObjectOutputStream(new FileOutputStream("Progg.ser")); or.writeObject(superUser); or.close(); } catch (IOException ex) { ex.printStackTrace(); } try { ObjectInputStream is = new ObjectInputStream(new FileInputStream("Progg.ser")); SuperUser superUser1 = (SuperUser) is.readObject(); } catch (Exception ex) { ex.printStackTrace(); } } } Вывод: // Текст // НеТекст // Бесполезная программа // Использование бесполезной программы // // Текст // НеТекст // Бесполезная программа // Использование бесполезной программы // // Process finished with exit code 0
Комментариев нет:
Отправить комментарий