Реферат по предмету "Информатика, программирование"


Сериализация объектов

/>/>/>Факультет«Информатика и системы управления»
Методические указания к лабораторной работе
по курсу «Распределенныесистемы обработки информации»
«Сериализацияобъектов»
Москва 2004 г.
/>/>/>/>/>/>Цель работы
1.        Познакомитьсяс сериализацией объектов и её практическим применением.
2.        Изучитьметод клонирования объектов при помощи сериализации.
3.        Освоитьклассы ObjectInputStream и ObjectOutputStream пакета java.io.
4.        Научитсяобрабатывать действия мыши и клавиатуры.
5.        Изучитьклассы Menu, MenuBar, MenuItem, Dialog, FileDialog пакета java.awt.
6.        Научитьсяиспользовать таблицы.
7.        Применитьполученные знания на практике/>/>/>/>/>/>/>Задание для домашней подготовки
Ознакомитьсяс теоретическим материалом, представленным в приложениях к данным методическимуказаниям и примерами программ. Ознакомиться с текстом задания к лабораторнойработе, предложить размещение компонентов и функциональность, удовлетворяющую требованиямзадания к лабораторной работе, и написать программу./>/>/>/>/>Задание к лабораторной работе
Создать оконноеприложение, реализующее графический интерфейс доступа к массиву объектовклассов Employee и Manager (см. приложение). Работа пользователя должна осуществляться припомощи меню, обязательно содержащего следующие элементы.
– Меню«Файл» (Внутри – пункты меню «Новый каталог», «Сохранить данные», «Загрузитьданные», «Передать данные»).
– Меню«Добавить (Внутри – пункты меню «Новый работник», «Новый менеджер»,«Клонировать сотрудника»).
Добавлениеинформации о новых сотрудниках должно происходить при помощи диалоговых окон.
На главнойформе должна присутствовать таблица с информацией о сотрудниках (Ф.И.О., оклад,дата поступления).
Нижеописываются действия программы на выбор соответствующих пунктов меню.
Меню«ФАЙЛ»
«Новыйкаталог» – вся информация в таблице стирается. На экране показываются толькозаголовки таблицы.
«Сохранитьданные» – объект базы данных сериализуется в файл. Внутри объекта данных дляэтого должен быть предусмотрен соответствующий метод.
«Загрузитьданные» – объект базы данных десериализуется из файла. Внутри объекта данныхдля этого должен быть предусмотрен соответствующий метод.
«Выход» – вызовсистемного метода System.exit(0).
Меню«ДОБАВИТЬ»
«Добавитьработника» – показывается диалоговое окно, в котором пользователь может ввестиданные для нового работника. Эти данные заносятся в объект базы данных, послечего обновляется информация в таблице.
«Добавитьменеджера» – аналогично предыдущему пункту, но с учётом особенностей класса Manager. Класс диалогового окнадобавления менеджера может быть наследован от аналогичного класса окна Employee.
«Клонироватьсотрудника» – под этим необычным названием скрывается стандартное копированиезаписи базы данных, которое осуществляется методом клонирования сериализацией(см. приложение). Копия добавляется в конец таблицы. Выбор записи длякопирования осуществляется выделением соответствующего поля в таблице.
/>
Рисунок 1: Вариант исполнениязадания/>/>/>/>/>/> Содержание отчета
Отчет долженсодержать:
1.        Постановкузадачи, решаемой отлаженной программой.
2.        Руководствопользователя отлаженной программы, содержащее описание интерфейсов всех функцийпрограммы.
3.        Листингпрограммы с необходимыми комментариями./>/>/>/>/>/>Контрольные вопросы
1.        Чтотакое сериализация / десериализация?
2.        Какоедиалоговое окно называется модальным?
3.        Почемуне все объекты можно сериализовать?
4.        Какузнать, можно ли сериализовать объект класса, встроенного в Java?
5.        Почемувозможность сериализации сохраняется при наследовании?
6.        Сколькополей содержит интерфейс Serializable?
7.        Чтоподразумевается под термином «клонирование объектов».
8.        Назовите«родственные связи» между классами Menu, MenuItem, MenuBar, MenuShortCut и MenuComponent.
9.        Назовитедва способа, позволяющих добавить горизонтальную черту между пунктами меню.
10.     Какзаставить приложение записывать на экране в текстовой области символы ‘*’вместо символов, вводимых с клавиатуры?
11.     Чтотакое «модель таблицы»?
12.     Гдехранятся данные для таблицы?
13.     Какиеданные могут содержать ячейки таблицы JTable?
14.     Каксделать возможным выбор нескольких элементов таблицы./>/>/>/>/> Литература
Официальныеисточники:
1.        КенАрнольд, Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.
2.        Официальныйсайт Java – java.sun.com/ (есть раздел на русском языке с учебником).
3.        Java™ 2 SDK, Standard Edition Documentation – java.sun.com/products/jdk/1.5/index.html.
4.        ДжеймсГослинг, Билл Джой, Гай Стил. Спецификация языка Java (The Java Language Specification – www.javasoft.com/docs/books/jls/). Перевод на русский язык –http://www.uni-vologda.ac.ru/java/jls/index.html
5.        Официальныйсайт проекта Eclipse – www.eclipse.org/.
Другое:
1.        ДмитрийРамодин. Начинаем программировать на языке Java.
2.        НиколайСмирнов. Java 2: Учебное пособие.
3.        Картузов А.В. Программированиена языке Java.
4.        Вязовик Н.А. Программированиена Java.
5.        АлексейЛитвинюк. Введение в интегрированную среду разработки Eclipse – lib.juga.ru/article/articleview/174/1/69/.
/>/>/>/>Приложение 1. Создание меню
Вконтейнер типа Frame заложена возможность установки стандартной строки меню(menubar), располагаемой ниже строки заголовка, как показано на рисунке 1. Этастрока – объект класса MenuBar.
Все,что нужно сделать для установки строки меню в контейнере Frame – это создать объекткласса MenuBar и обратиться к методу setMenuBar():
Frame f = new Frame («Пример меню»);
MenuBar mb = new MenuBar();
f.setMenuBar(mb);
Еслиимя mb не понадобится, можно совместить два последних обращения к методам:
f.setMenuBar(new MenuBar());
Разумеется,строка меню еще пуста и пункты меню не созданы.
Каждыйэлемент строки меню – выпадающее меню(drop-down menu) – это объекткласса Menu. Создать эти объекты изанести их в строку меню ничуть не сложнее, чем создать строку меню:
Menu mFile = new Menu («Файл»);
mb.add(mFile);
Menu mEdit = new Menu («Правка»);
mb.add(mEdit);
Menu mView = new Menu («Вид»);
mb.add(mView);
Menu mHelp = new Menu («Справка»);
mb.setHelpMenu(mHelp);
ит.д. Элементы располагаются слева направо в порядке обращений к методам add(), как показано на рисунке1. Во многих графических системах принято меню Справка (Help) прижимать кправому краю строки меню. Это достигается обращением к методу setHelpMenu(), но фактическоеположение меню Справка определяется графической оболочкой.

/>
Рисунок2.Система меню
Затемопределяем каждое выпадающее меню, создавая его пункты. Каждый пункт меню – этообъект класса MenuItem. Схема его создания и добавления к меню точно такая же, как исамого меню:
MenuItem create = new MenuItem («Создать»);
mFile.add(create);
MenuItem open = new MenuItem («Открыть…»);
mFile.add(open);
ит.д. Пункты меню будут расположены сверху вниз в порядке обращения к методам add().
Частопункты меню объединяются в группы. Одна группа от другой отделяетсягоризонтальной чертой. На рисунке 1 черта проведена между командами Открыть иОтправить. Эта черта создается методом addSeparator() класса Menu или определяется как пункт меню с надписью специального вида – дефисом:
mFile.add(new MenuItem(» –»));
Интересно,что класс Menu расширяет класс MenuItem, а не наоборот. Этоозначает, что меню само является пунктом меню, и позволяет задавать меню вкачестве пункта другого меню, тем самым организуя вложенные подменю:
Menu send = new Menu («Отправить»);
mFile.add(send);
Здесьменю send добавляется в меню mFile как один из его пунктов.Подменю send заполняется пунктамименю как обычное меню.
Частокоманды меню создаются для выбора из них каких-то возможностей, подобнокомпонентам checkbox. Такие пункты можновыделить щелчком кнопки мыши или отменить выделение повторным щелчком. Этикоманды – объекты класса CheckboxMenuItem:
CheckboxMenuItemdisk = new CheckboxMenuItem («Диск A:», true);
send.add(disk);
send.add (new CheckboxMenuItem («Архив»));
ит.д.
Все,что получилось в результате перечисленных действий, показано на рисунке 1.
Многиеграфические оболочки, но не MS Windows, позволяют создавать отсоединяемые(tear-off)меню, которые можно перемещать по экрану. Это указывается в конструкторе
Menu(String label, boolean tearOff)
Еслиtearoff == true и графическая оболочка умеет создавать отсоединяемое меню, тооно будет создано. В противном случае этот аргумент просто игнорируется.
Наконец,надо назначить действия командам меню. Команды меню типа MenuItem порождают события типа ActionEvent, поэтому нужноприсоединить к ним объект класса-слушателя как к обычным компонентам, записавчто-то вроде
create.addActionListener (new SomeActionEventHandler())
open.addActionListener (new AnotherActionEventHandler())
Пунктытипа CheckboxMenuItem порождают события типа ItemEvent, поэтому надо обращатьсяк объекту-слушателю этого события:
disk.addItemListener (new SomeItemEventHandler())
Оченьчасто действия, записанные в командах меню, вызываются не только щелчком кнопкимыши, но и «горячими» клавишами-акселераторами (shortcut), действующими чащевсего при нажатой клавише . На экране в пунктах меню, которымназначены «горячие» клавиши, появляются подсказки вида Ctrl+N, Ctrl+O, как нарисунке 1. «Горячая» клавиша определяется объектом класса MenuShortcut и указывается в егоконструкторе константой класса KeyEvent, например:
MenuShortcut keyCreate = new MenuShortcut (KeyEvent.VK_N);
Послеэтого «горячей» будет комбинация клавиш +. Затемполученный объект указывается в конструкторе класса MenuItem:
MenuItem create = new MenuItem («Создать», keyCreate);
Нажатие+ будет вызывать окно создания. Эти действия, разумеется,можно совместить, например,
MenuItem open = new Menultern («Открыть…»,
new – MenuShortcut (KeyEvent.VK_O));
Можнодобавить еще нажатие клавиши . Действие пункта меню будетвызываться нажатием комбинации клавиш ++,если воспользоваться вторым конструктором:
MenuShortcut (int key, boolean useShift)
Саргументом useShift== true.Пример создания меню
import java.awt.*;
import java.awt.event.*;
public class MenuScribble extends Frame {
public MenuScribble (String s) {
super(s);
MenuBar mb = new MenuBar();
setMenuBar(mb);
Menu f = new Menu («Файл»);
Menu h = new Menu («Справка»);
mb.add(f);
mb.add(h);
MenuItem open = new MenuItem («Открыть…»,
new MenuShortcut (KeyEvent.VK_0));
MenuItem save = new MenuItem («Сохранить»,
new MenuShortcut (KeyEvent.VK_S));
MenuItem saveAs = new Menultera («Сохранить как…»);
MenuItem exit = new MenuItem («Выход»,
new MenuShortcut (KeyEvent.VK_Q));
f.add(open);
f.add(save);
f.add(saveAs);
f.addSeparator();
f.add(exit);
open.addActionListener (new ActionListener() {
public void actionPerformed (ActionEvent e) {
FileDialog fd = new FileDialog (new Frame(),
«Загрузить»,FileDialog.LOAD);
fd.setVisible(true);
}
});
saveAs.addActionListener (new ActionListener() {
public void actionPerformed (ActionEvent e) {
FileDialog fd = new FileDialog (new Frame(),
«Сохранить»,FileDialog.SAVE);
fd.setVisible(true);
}
});
exit.addActionListener (new ActionListener() {
public void actionPerformed (ActionEvent e) {System.exit(0);}
});
MenuItem about = new MenuItem («О программе»);
h.add(about);
about.addActionListener (
 // …обработчик
);
addWindowListener (new WinClose());
setVisible(true);
} //конец конструктора
 // вложенный класс –обработчик события закрытия окна
class WinClose extends WindowAdapter {
public void windowClosing (WindowEvent e) {System.exit(0);}
}
public static void main (String[] args) {
new MenuScribble («Программа с меню»);
}}
Приложение 2.Контейнер Dialog
/>
КонтейнерDialog – это окно обычно фиксированного размера, предназначенное для ответа насообщения приложения. Оно автоматически регистрируется в оконном менеджере графическойоболочки, следовательно, его можно перемещать по экрану, менять его размеры. Ноокно типа Dialog, как и его суперкласс – окно типа Window, – обязательноимеет владельца owner, который указывается в конструкторе. Окно типа Dialogможет быть модальным(modal), в котором надо обязательно выполнить всепредписанные действия, иначе из окна нельзя будет выйти.
Вклассе семь конструкторов. Из них:
·        Dialog(Dialog owner)– создает немодальное диалоговое окно с пустой строкой заголовка;
·        Dialog(Dialog owner, String title) – создает немодальное диалоговое окно со строкой заголовка title;
·        Dialog(Dialog owner, String title, boolean modal) – создает диалоговое окно, которое будетмодальным, если modal == true.
Четыредругих конструктора аналогичны, но создают диалоговые окна, принадлежащие окнутипа Frame:
Dialog (Frame owner)
Dialog (Frame owner, String title)
Dialog (Frame owner, boolean modal)
Dialog (Frame owner, String title, boolean modal)
Средиметодов класса интересны методы: isModal(), проверяющий состояние модальности, и setModal (boolean modal), меняющий это состояние./>/>События
КромеСобытий класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при изменении размеровокна, его перемещении или удалении с экрана, а также показа на экранепроисходит событие WindowEvent.
Впримере 1 создается модальное окно доступа, в которое вводится имя и пароль.Пока не будет сделан правильный ввод, другие действия невозможны. На рисунке 2показан вид этого окна.
Пример1. Модальноеокно доступа
import java.awt.*;
import java.awt.event.*;
class LoginWin extends Dialog {
LoginWin(Frame f, String s) {
super (f, s, true);
setLayout(null);
setFont (new Font («Serif», Font.PLAIN, 14));
Label l1 = new Label («Ваше имя:», Label.RIGHT);
l1.setBounds (20, 30, 70, 25); add(l1);
Label l2 = new Label («Пароль:», Label.RIGHT);
l2.setBounds (20, 60, 70, 25); add(l2);
TextField tf1 = new TextField(30);
tf1.setBounds (100, 30, 160, 25); add(tf1);
TextField tf2 = new TextField(30);
tf2.setBounds (100, 60, 160, 25); add(tf2);
tf2.setEchoChar ('*');
Button b1 = new Button («Применить»);
b1.setBounds (50, 100, 100, 30); add(b1);
Button b2 = new Button («Отменить»);
b2.setBounds (160, 100, 100, 30); add(b2);
setBounds (50, 50, 300, 150);
}
}
class DialogTest extends Frame {
DialogTest(String s) {
super(s);
setLayout(null);
setSize (200, 100);
setVisible(true);
Dialog d = new LoginWin (this, «Окно входа»);
d.setvisible(true);
}
public static void main (String[] args) {
Frame f = new DialogTest (» Окно-владелец»);
f.addWindowListener (new WindowAdapter() {
public void windowClosing (WindowEvent ev) {
System.exit(0);
}
});
}
}
/>
Рисунок2.Модальное окно доступа
/>
Приложение 3.Контейнер FileDialog.
КонтейнерFileDialog – это модальное окно с владельцем типа Frame, содержащее стандартноеокно выбора файла операционной системы для открытия (константа LOAD) илисохранения (константа SAVE). Окна операционной системы создаются и помещаются вобъект класса FileDialog автоматически.
Вклассе три конструктора:
·          FileDialog(Frame owner)– создает окно с пустым заголовком для открытия файла;
·          FileDialog(Frame owner, String title) – создает окно открытия файла с заголовком title;
·          FileDialog(Frame owner, String title, int mode) – создает окно открытия или сохранения документа;аргумент mode имеет два значения: FileDialog.LOAD и FileDialog.SAVE.
Методыкласса getDirectory() и getFile() возвращают тольковыбранный каталог и имя файла в виде строки String. Загрузку илисохранение файла затем нужно производить методами классов ввода / вывода.
Можноустановить начальный каталог для поиска файла и имя файла методами setDirectory (String dir) и setFile (String fileName).
Вместоконкретного имени файла fileName можно написать шаблон, например, *.java (первые символы – звездочкаи точка), тогда в окне будут видны только имена файлов, заканчивающиеся точкойи словом java.
МетодsetFilenameFilter (FilenameFilter filter) устанавливает шаблон filter для именивыбираемого файла. В окне будут видны только имена файлов, подходящие подшаблон. Этот метод не реализован в SUN JDK на платформе MS Windows./>/>События
Кромесобытий классаComponent: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при изменении размеровокна, его перемещении или удалении с экрана, а также показа на экране происходитсобытие WindowEvent. 
Приложение 4. Создание таблиц
Для созданиятаблиц используется компонент JTable, обладающий довольно сложной структурой,которая, впрочем, скрыта от пользователя. Таким образом, на основе лишьнескольких строк кода возможно получить полнофункциональную таблицу.
Компонент JTable не хранит информацию осодержимом в себе, а использует т.н. модель таблицы. Для создания моделипредусмотрен специальный класс AbstractTableModel, в котором необходимо переопределитьследующие методы:
public int getRowCount(); – возвращает количествострок в таблице.
public int getColumnCount(); – возвращает количествостолбцов.
public object getValueAt (int row, int column); – возвращает содержимоеячейки в ряду row и столбце column.
Как видно изпрототипа метода, в ячейке таблицы может находиться любой объект, в частности,строка или картинка. Для помещения числа в ячейку, необходимо использоватьсоответствующий числовой объект:
return new Integer(100);
Для заданияназваний столбцам таблицы необходимо переопределить метод:
publicint getColumnName (int c);
Параметр суказывает на номер столбца. Внутри должна быть конструкция switch-case (или if-else), возвращающая на каждыйномер с названием колонки.
publicString getColumnName (int c) {
if(c == 0)
return«Ф.И.О.»;
elseif (c == 1)
return«Должность»;
elseif (c==2)
return«Зарплата»;
elseif (c == 3)
return«Год»;
elseif (c == 4)
return«Месяц»;
elseif (c == 5)
return«День»;
else
return null;
}
Также вабстрактной модели таблицы можно непосредственно хранить данные в том или иномвиде и предусмотреть методы для их модификации. После модификации данных нужносообщить JTable о том, что структура таблицы / количество строк изменились,для этого используются такие методы класса AbstractTableModel, как fireRowsInserted и пр.
Далеесоздаётся экземпляр класса JTable, в конструкторе которого указываются объектмодели таблицы:
JTableempTable = new JTable(myTableModel);
Модельтаблицы может быть указана и позже с помощью метода setModel.
И, наконец,для создания полос прокрутки на элементе воспользуемся стандартным методом –поместим таблицу на панель типа JScrollPane:
JScrollPane pane= new JScrollPane(empTable);
Осталосьразместить готовую панель на форме. Воспользуемся следующим кодом:
this.getContentPane().add(pane);
Впрограмме требуется информация о выделенной строке таблицы. Для полученияданных необходимо:
1.Ограничить пользователя выбором одной строки. Для этого необходимо задать режимвыбора строк таблицы.
table.getSelectionModel().setSelectionMode(mode)
Параметр mode принимает три значения:
0– выбирается одна строка.
1– несколько смежных строк.
2– несколько произвольных строк.
2.Для получения номера выбранной строки воспользоваться методом getSelectedRow().
Примечание: Для режима выборанескольких строк существует метод getSelectedRows(), возвращающий массив int[] номеров выделенныхстрок.
/>/>Приложение5. Сериализация объектов
Методыклассов ObjectInputStreamи ObjectOutputStream позволяют прочитать из входного байтового потока илизаписать в выходной байтовый поток данные сложных типов – объекты, массивы,строки – подобно тому, как методы классов DataInputStream и DataOutputStream читают и записываютданные простых типов.
Сходствоусиливается тем, Что классы Objectxxx содержат методы как для чтений, так и записи простыхтипов. Впрочем, эти методы предназначены не для использования в программах, адля записи / чтения полей объектов и элементов массивов.
Процессзаписи объекта в выходной поток получил название сериализации (serialization),а чтения объекта из входного потока и восстановления его в оперативной памяти –десериализации (deserialization).
Сериализацияобъекта нарушает его безопасность, поскольку зловредный процесс можетсериализовать объект в массив, переписать некоторые элементы массива,представляющие private‑поля объекта, обеспечив себе, например, доступ ксекретному файлу, а затем десериализовать объект с измененными полями исовершить с ним недопустимые действия.
Поэтомусериализации можно подвергнуть не каждый объект, а только тот, которыйреализует интерфейс Serializable. Этот интерфейс не содержит ни полей, ни методов. Реализовать внем нечего. По сути дела запись
classA implements Serializable{…}
этотолько пометка, разрешающая сериализацию класса А.
ВJava процесс сериализации максимально автоматизирован. Достаточно создатьобъект класса ObjectOutputStream, связав его с выходным потоком, и выводить вэтот поток объекты методом writeObject():
MyClass me = new MyClass («abc», -12, 5.67e‑5);
int[] arr = {10, 20, 30};
ObjectOutputStream oos = new ObjectOutputStream (
new FileOutputStream («myobjects.ser»));
oos.writeObject(me);
oos.writeObject(arr);
oos.writeObject («Some string»);
oos.writeObject (new Date());
oos.flush();
Ввыходной поток выводятся все нестатические поля объекта, независимо от правдоступа к ним, а также сведения о классе этого объекта, необходимые для егоправильного восстановления при десериализации. Байт-коды методов класса несериализуются.
Еслив объекте присутствуют ссылки на другие объекты, то они тоже сериализуются, а вних могут быть ссылки на другие объекты, которые опять-таки сериализуются, иполучается целое множество причудливо связанных между собой сериализуемыхобъектов. Метод writeObject() распознает две ссылки на один объект и выводит его ввыходной поток только один раз. К тому же, он распознает ссылки, замкнутые вкольцо, и избегает зацикливания.
Всеклассы объектов, входящих в такое сериализуемое множество, а также все ихвнутренние классы, должны реализовать интерфейс Serializable, в противном случаебудет выброшено исключение класса NotSerializableException и процесс сериализации прервется.Многие классы J2SDK реализуют этот интерфейс. Учтите также, что все потомкитаких классов наследуют реализацию (может быть сериализацию?). Например, классjava.awt. Component реализует интерфейс Serializable, значит, все графическиекомпоненты можно сериализовать. Не реализуют этот интерфейс обычно классы,тесно связанные с выполнением программ, например, java.awt. Toolkit. Состояние экземпляровтаких классов нет смысла сохранять или передавать по сети. Не реализуютинтерфейс Serializable и классы, содержащие внутренние сведения Java «дляслужебного пользования».
Десериализацияпроисходит так же просто, как и сериализация:
ObjectlnputStream ois = new ObjectInputStream (
new FilelnputStream («myobjects.ser»));
MyClass mcl = (MyClass) ois.readObject();
int[] a = (int[]) ois.readObject();
String s = (String) ois.readObject();
Date d = (Date) ois.readObject();
/> 
Приложение 6. Клонирование при помощисериализации
Подклонированием объекта подразумевают получение его точной копии, независимой оторигинала. Таким образом, изменение параметров объекта-клона не влияет наоригинал, верно и обратное: изменение оригинала не влияет на клон.
Сериализация– один из методов для клонирования объектов. Суть его состоит в следующем:записать исходный объект в поток вывода, а затем считать обратно. В результатеполучается совершенно новый объект, по свойствам идентичный оригиналу.
Необходимопонимать, что данный способ не является оптимальным в силу следующих причин:
– объект,клонируемый таким образом, должен быть сериализуемым, что справедливо далеко недля всех объектов.
– клонированиесериализацией работает несколько медленнее обчного метода клонирования.
Впрочем,в случаях когда скорость написания кода становится важнее оптимизации скоростивыполнения, этот метод оказывается как нельзя кстати.
Дляреализации метода рекомендуется использовать следующую схему.
– Создаётсякласс SerialCloneable, имплементирующий интерфейсы Cloneable и Serializable.
– КлассSerialCloneable имеет единственный методclone(), в котором происходитсериализация объекта. Метод clone() возвращает объект из входного потока.
– Класс,который должен содержать поддержку клонирования, наследуется от класса SerialCloneable.
Приложение 7. Пример кода классов Employeeи Manager
public class Manager extends Employee {
private Employee secretary;
public Manager (String n, double s, int year, int month, int day) {
super (n, s, year, month, day);
secretary = null;
}
public void setSecretary (Employee s) {
secretary = s;
}
}
public class Employee implements Serializable {
private String name;
private double salary;
private Date hireDay;
public Employee(){};
public Employee (String n, double s, int year, int month, int day){
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar (year, month‑1,day);
hireDay = calendar.getTime();
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public Date getHireDay() {
return hireDay;
}
public void raiseSalary (double byPercent) {
double raise=salary*byPercent/100;
salary+=raise;
}
}


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.