#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
Комментариев нет:
Отправить комментарий