Домашнее задание № 3 по Java

advertisement
Домашнее задание № 3
Изучить пособие до 105 страницы. Читать настоящий документ и выполнить Задание 1
Задание 2. Текст классов и скриншоты аввода ко мне на почту.
Отношения Часть-Целое
Человек - экземпляр вида Млекопитающие. К этому же виду относится слон. Вид
млекопитающие имеют атрибуты: глаза и конечности. Всех млекопитающих характеризует общее
поведение: они умеют ходить (в не летать). Таким образом все представители вида
млекопитающих совместно используют атрибуты и поведение млекопитающих.
Отношение Есть (Is-A)
Рассмотрим экземпляр класса Человек с именем Петр. Петр - человек и поэтому является
млекопитающим.
Петр------------>Человек------------>Млекопитающие
есть
Экземпляр
класса
Отношение Часть Целого
У каждого человека имеется сердце, что является примером принадлежности Has-a. Это
же отношение можно представить наоборот: Сердце является частью человека. Таких отношений
огромное количество: Машина-двигатель, Дом-квартира и т.д.
Наследование
Философия наследования отображает реальные отношения, существующие в реальном
мире. Например, ребенок наследует свойства обоих родителей: класс получает набор атрибутов и
поведение от другого (других) класса.
Суперкласс и подкласс
Рассмотрим предметную область, связанную с авиаперевозками. Рассмотрим авиабилеты,
которые могут быть двух типов: приобретенные (не прошедшие регистрацию) и
зарегистрированные билеты. Оба билета имеют множество общих атрибутов: номер рейса, дата,
время и маршрут. При этом зарегистрированный билет содержит атрибут Место, и номер выхода
на посадку, которые отсутствует в приобретенном билете.
Билет
Приобретенный
Билет
Зарегистрированный
Билет
Мы рассмотрели структуру и поведение, которые являются для двух классов и
сформировали суперкласс БИЛЕТ на основании общих характеристик. Суперкласс представляет
собой обобщенные свойства, а подклассы представляют собой специализацию, в которой
атрибуты и поведение добавляются, изменяются или скрываются. Скрываются, когда подкласс
использует одноименные с суперклассом имена методов.
Таким образом, Суперкласс - класс, от которого другой класс унаследовал свойства.
Суперкласс использует его свойства совместно с дочерними классами. Подкласс - класс, который
унаследовал атрибуты и методы от суперкласса.
Подклассы не наследуют конструкторы суперкласса, поскольку конструкторы, с точки
зрения компилятора, обладают индивидуальными особенностями. При этом подклассы не
ограничиваются методами, определенными в суперклассе. Они также могут собственные
элементы данных и методы, помимо унаследованных.
Суперкласс иногда называют базовым классом, а подкласс - производным классом.
Два других (кроме абстракции и инкапсуляции) основополагающих принципов объектноориентированного подхода являются Обобщение / Специализация (что позволяет использовать
наследование) и полиморфизм. Обобщение позволяет рассматривать общие категории объектов,
которые имеют общие свойства, а затем определить специализированные подклассы , которые
наследуют свойства общих категорий.
Для чего необходимо обобщение
Основная необходимость обобщения возникает при расширении возможностей
программы. Рассмотрим такую возможность на простом примере. Предположим, что имеется
программа, которая выводит строку, полученную от пользователя, на экран. Также предположим,
что требование к программе изменились и возникла необходимость отображать целое число.
Допустим, что мы располагаем суперклассом Data, который содержит метод,
отображающий его значение. Также имеются классы Character и Float. Для того, чтобы отображать
целое число, нужно всего лишь создать класс с именем Integer, который будет являться
подклассом Data.
Добавление нового класса не затронет существующие и не нужно писать различные
методы для каждого из этих подклассов. Поскольку суперкласс владеет этим методом, подклассы
наследуют его.
Обобщение помогает в абстракции. Суперкласс располагает атрибутами и методами,
которые составляют специфику суперкласса и наследуются всеми его подклассами.
В объектно-ориентированном подходе основное внимание при проектировании классов
уделяется совместному использованию данных и методов обращаться к данным и методам из
других классов. При этом необходимо обеспечить защиту данных и методов класса, не позволяя
напрямую к ним обращаться. Такое свойство обеспечивает инкапсуляция, скрывающая данные и
методы с помощью интерфейса: методов, которые объявлены в классе как public, и позволяющие
другим классам реализовывать функциональность класса.
Когда необходимо обобщение?
Обобщение следует использовать, когда имеется наличие общих свойств между классами и
когда возникает экономия кода в разработке методов классов, приводящая к уменьшению
трудоемкости поддержки программной системы .
Наследование способствует:


Уменьшению избыточности (дублирования) и многократного использования кода.
Уменьшению трудоемкости внесения изменений в систему, поскольку общий код
располагается в одном месте (в суперклассе) и любое изменение кода суперкласса,

автоматически распространяется на поведение подклассов, которые наследуют новое
поведение.
Расширять функциональные возможности существующего класса, добавляя новые методы
к подклассу.
В языке Java наследование класса описывается с помощью ключевого слова extends для
того, чтобы получить класс из суперкласса, или иными словами расширить функциональные
возможности суперкласса.
Используется следующий синтаксис:
public class<имя подкласса> extends <имя суперкласса>
Например,
public class Conformed extends Ticket
{
...
}
Задание 1 :
Закодировать в отдельных файлах нового или существующего проекта (новый пакет
ifmo.pract3) следующие классы:
1. Класс Applicant, который является суперклассом для следующего класса
2. Класс Candidate, который является подклассом, расширяющим класс Applicant.
3. Класс с произвольным именем, который содержит единственный метод метод main() и
выполняет операции создания объектов классов Applicant и Candidate и обращается к
методам этих объектов.
4. Выполнить класс, содержащий метод main() и проанализировать вывод, в случае
непонимания - задайте вопросы преподавателю на лекции.
1. Суперкласс Applicant содержит:
1. Атрибуты:
private String applicantId;
private String applicantName;
private String applicantAddress;
private String applicantPosition;
2. Getter/Setter для всех атрибутов
3. Конструктор с присвоением всех значений атрибутов (с использованием среды Eclipse)
4. Конструктор по умолчанию, типа
public Applicant()
{ super();
applicantId="Noname";
applicantName=" Noname ";
applicantAddress=" Noname ";
applicantPosition=" Noname";
}
Вы вероятно помните, что конструктор по умолчанию не создается компилятором
автоматически, если создан конструктор с параметрами. Так что этот конструктор создается
ручками.
В конструкторе используется утверждение super();
По этой команде происходит обращение к конструктору суперкласса по умолчанию для
создания объекта. Суперклассом для класса Applicant является класс Object, который является
суперклассом для всех классов. Обращение super() подразумевает выполнение оператора
java.lang.Object.Object(), как показано на рисунке ниже:
Вы можете получить аналогичную картинку, если наведете курсор на оператор super(),
попробуйте....
4. Метод public void DisplayDetails(), который выводит значение всех атрибутов объекта
класса Applicant. (Своими руками на свой вкус, используя System.out.print..... Например так (но
постарайтесь проявить оригинальность, вводя свои комментарии):
public void displayDetails()
{
System.out.print("App. Id. "+getApplicantId());
System.out.print("App. Name "+getApplicantName());
System.out.print("App. Addr. "+getApplicantAddress());
System.out.println("App. Pos. "+getApplicantPosition());
}
2. Подкласс Candidate
расширяет класс кодируется
Applicant public class Candidate extends Applicant {
и содержит:
1. Атрибуты:
private String interviewDate;
private boolean candidateStatus;
2. Getter/Setter для всех атрибутов (с использованием среды Eclipse)
3. Конструктор Candidate (<список параметров > ) для присвоения всех значений
атрибутов, содержащихся в классе Applicant, типа
public Candidate(String applicantId, String applicantName,
String applicantAddress, String applicantPosition) {
super(applicantId, applicantName, applicantAddress, applicantPosition);
}
Обратите внимание, что здесь происходит обращение к конструктору суперкласса, но это
суперкласс уже не Object, а Applicant, который расширяется (extends) классом Candidate, как
показано на рисунке ниже:
4. Конструктор Candidate (<список параметров> ) для присвоения всех значений атрибутов,
содержащихся в классе Applicant, и присвоения родных значений для объекта класса Candidate,
типа
public Candidate(String applicantId, String applicantName,
String applicantAddress, String applicantPosition,
String interviewDate, boolean candidateStatus) {
super(applicantId, applicantName, applicantAddress, applicantPosition);
this.interviewDate = interviewDate;
this.candidateStatus = candidateStatus;
}
5. Конструктор Candidate() по умолчанию (без параметров), типа
public Candidate() {
super();
}
Обратите внимание, что здесь происходит обращение к конструктору класса Applicant по
умолчанию, как показано на рисунке ниже.
6. Метод public void DisplDetails(), который выводит значение всех атрибутов объекта
класса Candidate . При этом в этом методе происходит обращается к методу displayDetails()
объекта класса Applicant, чтобы воспользоваться его методом для вывода общих полей. (Своими
руками на свой вкус, используя System.out.print..... Например так (но постарайтесь проявить
оригинальность, вводя свои комментарии):
public void dispDetails() {
super.displayDetails();
System.out.print("Cand. Date. " + getInterviewDate());
System.out.println("Cand. Status. " + isCandidateStatus());
}
Класс с методом main
Этот класс предназначен для выполнения операций создания объектов классов Applicant
и Candidate и выполнение методов этих объектов.
Метод main должен принимать 4 параметра, определяющие исходные значения для
создания объекта Applicant, например, 001 Petrov Saint-Petersburg Manager, которые передаются
на вход класса, например, так как на рисунке ниже:
.
В методе main() выполнить следующие операторы:
public class GoApp {
public static void main(String[] args) {
Candidate c1 = new Candidate(); // Создание объекта c1 класса
Candidate
c1.dispDetails(); // выводит значения полей Noname, null и false
Candidate c2 = null;
System.out.println(args.length);
if (args.length == 4) {
c2 = new Candidate(args[0], args[1], args[2], args[3]);
c2.setInterviewDate("2014-12-31");
c2.setCandidateStatus(false);
c2.displayDetails();
c2.dispDetails();
}
Candidate c3 = new Candidate("qqqq", "eeee", "rrrrr", "tttttt",
"2014-12-31", true);
Applicant a = c3;
a.displayDetails();
c3.displayDetails();
c3.dispDetails();
if (c2 != null) {
Applicant a1 = c2;
a1.displayDetails(); // Для а недоступен метод
dispDetails()
// как только c2 присвоили a
}
}
4. Подготовить параметры и выполнить класс c методом main.
Проанализировать вывод и расставить комментарии в выполняемом классе к
каждому оператору, как это примерно сделано в первых двух строках.
Задание 2 - Упражнение 4. (со стр. 105 Пособия)
Постановка задачи.
Класс Employee создается для описания нового сотрудника в процессе приема на работу.
Класс содержит три поля: employeeName, employeeAddress и annualSalary, а
также метод displayDetails(),предназначенный для вывода всех значений
переменных класса для объекта и метод, который для любого другого объекта класса
Employee выводит некоторое выражение String. Для этого выполните следующие
действия:





Используя Eclipse, создайте в любом Java-проекте пакет с произвольным именем.
Создайте класс Employee и отметьте флажок создания метода main().
Определите в нем переменные класса (employeeName, employeeAddress и
annualSalary) с модификатором доступа private соответствующего типа
(String или float).
Создайте методы get и set для переменных класса (Следует использовать среду
Eclipse: правая кнопка в поле окна редактирования -> Source -> Generate Getters
and Setters ->для всех полей).
Создайте метод - конструктор для инициализации переменных класса.(Следует
использовать среду Eclipse: правая кнопка в поле окна редактирования -> Source ->
Generate Constructor using Fields). Конструктор - это метод, имя которого
совпадает с именем класса и который используется при создании объекта данного
класса. Если такой конструктор (с аргументами) создается, то необходимо в случае
необходимости явно создать конструктор по умолчанию Employee(), который
обычно создается компилятором Java.
Создайте метод toString. (Следует использовать среду Eclipse: правая кнопка в
поле окна редактирования -> Source -> toString). (Можно указать все поля). Этот
метод применяется, когда вы указываете объект класса Employee в операторе
System.out.println(o2) и выводит соответствующие значения. В данном
случае мы переопределяем свойственный всем классам метод toString(), с тем,
чтобы выводились необходимые нам значения объекта класса вместо мало
информативной ссылки на объект по умолчанию. Увидеть вывод можно, позже
удалив созданный вами метод toString() и повторить выполнение класса еще
раз. Перед описанием метода устанавливается аннотация @Override, которая
сообщает компилятору, что метод переписывается. Аннотации введены с 5-й
версии SDK и широко используются различными компонентами Java.
 Самостоятельно создайте метод displayDetails(), который возвращает
значения
полей
класса
c
использованием
оператора
return
employeeName + " " + employeeAddress+ " "+
annualSalary;
 Также самостоятельно создайте метод, который позволяет возвратить данные
объекта того же класса (Employee), который обращается к данному методу
текущего объекта. Определите сигнатуру для
метод
public String
askMeeting(Employee e). Как видно из сигнатуры, метод возвращает
значение String, которое пусть будет сообщением-приглашением на встречу
формируемое с помощью оператора return
"Дорогой
"
+
e.getEmployeeName() + " я буду рад(а) встрече с Вами по
адресу " + employeeAddress;. Корректным будет обращение только из
объекта класса Employee, который поддерживает метод getEmployeeName().
В подготовленном Eclipse методе main(), следует выполнить следующие действия:
1. Создать три разных объекта с именами o1, o2, o3 с данными своих знакомых с
помощью операторов:
Employee o1 = new Employee (<....>);
Employee o2 = new Employee (<....>);
Employee o3 = new Employee (<....>);
Например так:
Employee o1 = new Employee("AAAAAAAAAA", "BBBBBBBBBBBB",
10000);
2. Вывести сведения о значениях объектных переменных для каждого объекта o1, o2, o3,
используя метод displayDetails(), например,
System.out.println(o2.displayDetails());
3. Выведите на экран годовую зарплату всех созданных объектов как сумму
соответствующих полей объектов o1,o2 и o3. Например так:
System.out.println("Сумма = "+(o1.annualSalary + o2.annualSalary
+ o3.annualSalary));
4. В конце метода main() выведите сообщение, полученное при выполнении метода
askMeeting обращением от объекта o1 к объекту o3, например, так:
System.out.println(o3.askMeeting(o1));
5. И в заключение выполните команду System.out.println(o2), в которой неявно
используется вызов переопределенного метода toString(), имеющийся в каждом объекте.
Кроме того напишите оператор, который создает объект только на время использования его в
операторе, например так: System.out.println(new Employee("AAAAAAAAAA",
"BBBBBBBBBB", 10000));
Выполните созданный вами класс (Правая кнопка и в контекстном меню выбрать Run as>Java Application), проанализируйте полученный вывод вашего класса.
Download