Сделай Сам Свою Работу на 5

Практическое занятие №3. Проектирование классов.





Класс - это элемент, составляющий основу Java. А поскольку класс определяет форму и сущность объекта, то он является той логической конструкцией, на основе которой построен весь язык Java. Как таковой, класс образует основу объектно-ориентированного программирования на Java. Любое понятие, которое требуется реализовать в программе на Java, должно быть инкапсулировано в пределах класса.

Методы в Java — это законченная последовательность действий (инструкций), направленных на решение отдельной задачи.

Методы определяются всегда внутри классов:

 

public class Main { public static void foo() { // Тело метода } }

foo - это метод, который мы определили в классе Main, где:

public — тип доступа (метод может вызываться из другого класса).

static означает что метод статический, он принадлежит классу Main, а не конкретному экземпляру класса Main. Мы можем вызвать этот метод из другого класса так: Main.foo().

void значит, что этот метод не возвращает значение. Методы могут возвращать значение в Java и оно должно быть определено при объявлении метода. Однако, можно использовать return просто для выхода из метода.



 

В языке Java в пределах одного класса можно определить два или более методов, которые совместно используют одно и то же имя, но имеют разное количество параметров. Когда это имеет место, методы называют перегруженными, а о процессе говорят как о перегрузке метода (method overloading).

Кроме перегрузки существует также замещение, или переопределение методов (англ. overriding). Замещение происходит, когда класс потомок (подкласс) определяет некоторый метод, который уже есть в родительском классе(суперклассе), таким образом новый метод заменяет метод суперкласса. У нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса.

Выводы:

• Каждый java-метод должен быть внутри класса;

• Статические методы принадлежат классу, а не статические методы принадлежат объектам, экземплярам класса

• В пределах одного класса может быть два и более методов с одинаковыми именами, но разным набором параметров (перегрузка метода).

• Класс-потомок может обеспечивать свою реализацию метода, уже реализованного в одном из родительских классов (переопределение метода)



 

Рассмотрим доступ к свойствам объектов с помощью геттеров и сеттеров. Для переменных класса модификатор доступа public нежелателен т.к. он нарушает безопасность объекта. Например, для некоторых переменных нужно установить границы его возможных значений. С модификатором доступа public можно установить значения, которые выходят за границы, которые нам нужны. Для избежания этого мы должны установить некие правила задания значений переменным. Поэтому для защиты был придуман механизм доступа к переменным класса с помощью get и set (геттер и сеттер).

Get позволяет получить значения (читать значения), а Set - записать значения в переменную. В коде они представляют собой обычные методы. Но имя метода всегда начинается с префикса get или set.

Метод toString() - этот метод служит для представления объекта в виде строки. Метод toString() есть у всех объектов и все объекты используют этот метод при работе со строками. По-умолчанию он состоит из двух составляющих разделенных собачкой. Эти составляющие: имя_класса_объекта и хэш_кода. Пример: java.lang.Integer;@24d200d8.

Методы hashCode() и equals() были определены в классе Object, который является родительским классом для объектов java. Поэтому все java объекты наследуют от этих методов реализацию по умолчанию.

Метод hashCode() используется для получения уникального целого номера для данного объекта. Когда необходимо сохранить объект как структуру данных в некой хэш-таблице (такой объект также называют корзиной — bucket), этот номер используется для определения его местонахождения в этой таблице. По умолчанию, метод hashCode() для объекта возвращает номер ячейки памяти, где объект сохраняется.



Важно:

Если хеш-коды разные, то и входные объекты гарантированно разные.

Если хеш-коды равны, то входные объекты не всегда равны.

Ситуация, когда у разных объектов одинаковые хеш-коды называется — коллизией. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода.

Метод equals(), как и следует из его названия, используется для простой проверки равенства двух объектов. Реализация этого метода по умолчанию просто проверяет по ссылкам два объекта на предмет их эквивалентности.

https://habrahabr.ru/post/168195/

 

Рассмотрим пример.

package by.bsac.practical3.definition;

 

public class Person {

private String firstName;

private String lastName;

private String middleName;

private int age;

 

//конструктор с параметрами

public Person(String firstName, String middleName, String lastName, int age) {

this.firstName = firstName;

this.lastName = lastName;

this.middleName = middleName;

this.age = age;

 

System.out.println("Person "+getFirstName()+" "+getMiddleName()+" "+getLastName() +

" " + getAge()+" years old");

}

 

//конструктор без параметров

public Person() {

System.out.println("New Person without Fisrt Name, Middle Name, Last Name and Age was created");

}

 

/* переопределение метода для корректного приведения объекта Person к строке, используя значения firstName, middleName, lastName, age. Подсказка: Данный метод сгенерирован в среде разработки, в нашем случае Eclipse. При генерации методов средой разработки, необходимо проверять правильно ли сгенерирован метод */

@Override

public String toString() {

return "Person [firstName=" + firstName + ", middleName=" + middleName + ", lastName=" + lastName + ", age="

+ age + "]";

}

 

/* данный метод был переопределен для корректного формирования hashCode. Подсказка: Данный метод сгенерирован в среде разработки, в нашем случае Eclipse. При генерации методов средой разработки, необходимо проверять правильно ли сгенерирован метод */

 

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());

result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());

result = prime * result + ((middleName == null) ? 0 : middleName.hashCode());

return result;

}

 

/* метод equals переопределен для корректного сравнения объектов класса Person. В качестве атрибутов для сравнения выступают Имя, отчество, Фамилия, возраст. Также проверяется принадлежность передаваемого объекта obj к классу Person. Подсказка: Данный метод сгенерирован в среде разработки, в нашем случае Eclipse. При генерации методов средой разработки, необходимо проверять правильно ли сгенерирован метод */

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Person other = (Person) obj;

if (age != other.age)

return false;

if (firstName == null) {

if (other.firstName != null)

return false;

} else if (!firstName.equals(other.firstName))

return false;

if (lastName == null) {

if (other.lastName != null)

return false;

} else if (!lastName.equals(other.lastName))

return false;

if (middleName == null) {

if (other.middleName != null)

return false;

} else if (!middleName.equals(other.middleName))

return false;

return true;

}

 

public String getFirstName() {

return firstName;

}

public void setFirstName(String firstName) {

this.firstName = firstName;

}

public String getLastName() {

return lastName;

}

public void setLastName(String lastName) {

this.lastName = lastName;

}

public String getMiddleName() {

return middleName;

}

public void setMiddleName(String middleName) {

this.middleName = middleName;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

 

 

}

 

package by.bsac.practical3.definition;

 

public class Student extends Person {

 

private int id;

private String groupNumber;

 

public Student() {

System.out.println("Creating new student with undefined Fist Name, Second Name, Middle Name, Age and Group Number");

}

 

public Student(String firstName, String middleName, String lastName, int age, String groupNumber, int id){

super(firstName, middleName, lastName, age);

this.id = id;

this.groupNumber = groupNumber;

System.out.println("Creating new student with FistName:"+getFirstName()+", Middle Name="+getMiddleName()+", "

+" Last Name="+getLastName() + " Group Number="+getGroupNumber()+ " id=" + getId());

 

}

 

//Создайтедополнительныевариантыконструкторов,

//которыебудутинициализироватьоставшиесячленыкласса(member variables)

 

 

public String getGroupNumber() {

return groupNumber;

}

 

@Override

public String toString() {

return "Student [id=" + id + ", groupNumber=" + groupNumber + ", getFirstName()=" + getFirstName()

+ ", getLastName()=" + getLastName() + ", getMiddleName()=" + getMiddleName() + ", getAge()=" + getAge()

+ "]";

}

 

@Override

public int hashCode() {

final int prime = 31;

int result = super.hashCode();

result = prime * result + ((groupNumber == null) ? 0 : groupNumber.hashCode());

result = prime * result + id;

return result;

}

 

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (!super.equals(obj))

return false;

if (!(obj instanceof Student))

return false;

Student other = (Student) obj;

if (groupNumber == null) {

if (other.groupNumber != null)

return false;

} else if (!groupNumber.equals(other.groupNumber))

return false;

if (id != other.id)

return false;

return true;

}

 

public void setGroupNumber(String groupNumber) {

this.groupNumber = groupNumber;

}

 

public int getId() {

return id;

}

 

public void setId(int id) {

this.id = id;

}

 

}

 

package by.practical3.run;

 

import by.bsac.practical3.definition.Person;

import by.bsac.practical3.definition.Student;

 

public class Practical3Runner {

public static void main(String[] args){

Person personEn = new Person();

personEn.setFirstName("John");

personEn.setLastName("Smith");

personEn.setAge(19);

System.out.println(personEn);

Person personRu1 = new Person("Иван","Иванович","Иванов", 20);

System.out.println(personRu1);

Person personRu2 = new Person("Иван","Иванович","Иванов", 20);

System.out.println("personRu1 == personRu2 ? "+ personRu1.equals(personRu2));

System.out.println("person1 hashcode "+ personRu1.hashCode()

+ " person2 hashcode" + personRu2.hashCode());

 

Student student = new Student("Виктор", "Михайлович", "Селезнев", 20, "СП999", 19);

System.out.println("student.toString()="+student);

Student student1 = new Student("Дмитрий", "Иванович", "Попков", 20, "СП999", 18);

System.out.println("student == student1 ? "+ student.equals(student1));

}

 

}

 

Результат:

 

New Person without Fisrt Name, Middle Name, Last Name and Age was created

Person [firstName=John, middleName=null, lastName=Smith, age=19]

Person Иван Иванович Иванов 20 years old

Person [firstName=Иван, middleName=Иванович, lastName=Иванов, age=20]

Person Иван Иванович Иванов 20 years old

personRu1 == personRu2 ? true

person1 hashcode -1066259581 person2 hashcode-1066259581

Person Виктор Михайлович Селезнев 20 years old

Creating new student with FistName:Виктор, Middle Name=Михайлович, Last Name=Селезнев Group Number=СП999 id=19

student.toString()=Student [id=19, groupNumber=СП999, getFirstName()=Виктор, getLastName()=Селезнев, getMiddleName()=Михайлович, getAge()=20]

Person Дмитрий Иванович Попков 20 years old

Creating new student with FistName:Дмитрий, Middle Name=Иванович, Last Name=Попков Group Number=СП999 id=18

student == student1 ? false

 

 

Задания для самостоятельного решения:

 

Создать приложение, удовлетворяющее требованиям, приведенным в задании. Наследование применять только в тех заданиях, в которых это логически обосновано. Аргументировать принадлежность классу каждого создаваемого метода и корректно переопределить для каждого класса методы equals(), hashCode(), toString().

1. Создать объект класса Текст, используя классы Предложение, Слово.

Методы: дополнить текст, вывести на консоль текст, заголовок текста.

2. Создать объект класса Автомобиль, используя классы Колесо, Двигатель.

Методы: ехать, заправляться, менять колесо, вывести на консоль марку автомобиля.

3. Создать объект класса Самолет, используя классы Крыло, Шасси,

Двигатель. Методы: летать, задавать маршрут, вывести на консоль маршрут.

4. Создать объект класса Государство, используя классы Область, Район,

Город. Методы: вывести на консоль столицу, количество областей, площадь, областные центры.

5. Создать объект класса Планета, используя классы Материк, Океан, Остров.

Методы: вывести на консоль название материка, планеты, количество материков.

6. Создать объект класса Звездная система, используя классы Планета, Звезда, Луна. Методы: вывести на консоль количество планет в звездной системе, название звезды, добавление планеты в систему.

7. Создать объект класса Компьютер, используя классы Винчестер, Дисковод, Оперативная память, Процессор. Методы: включить, выключить, проверить на вирусы, вывести на консоль размер винчестера.

8. Создать объект класса Квадрат, используя классы Точка, Отрезок.

Методы: задание размеров, растяжение, сжатие, поворот, изменение цвета.

9. Создать объект класса Круг, используя классы Точка, Окружность.

Методы: задание размеров, изменение радиуса, определение принадлежности точки данному кругу.

10. Создать объект класса Щенок, используя классы Животное, Собака.

Методы: вывести на консоль имя, подать голос, прыгать, бегать, кусать.

11. Создать объект класса Наседка, используя классы Птица, Кукушка.

Методы: летать, петь, нести яйца, высиживать птенцов.

12. Создать объект класса Текстовый файл, используя классы Файл,

Директория. Методы: создать, переименовать, вывести на консоль содержимое, дополнить, удалить.

13. Создать объект класса Одномерный массив, используя классы Массив, Элемент. Методы: создать, вывести на консоль, выполнить операции (сложить, вычесть, перемножить).

14. Создать объект класса Простая дробь, используя класс Число. Методы:

вывод на экран, сложение, вычитание, умножение, деление.

15. Создать объект класса Дом, используя классы Окно, Дверь. Методы: закрыть на ключ, вывести на консоль количество окон, дверей.

16. Создать объект класса Цветок, используя классы Лепесток, Бутон.

Методы: расцвести, завять, вывести на консоль цвет бутона.

17. Создать объект класса Дерево, используя классы Лист, Ветка. Методы: зацвести, опасть листьям, покрыться инеем, пожелтеть листьям.

18. Создать объект класса Пианино, используя классы Клавиша, Педаль.

Методы: настроить, играть на пианино, нажимать клавишу.

19. Создать объект класса Фотоальбом, используя классы Фотография, Страница. Методы: задать название фотографии, дополнить фотоальбом фотографией, вывести на консоль количество фотографий.

20. Создать объект класса Год, используя классы Месяц, День. Методы: задать дату, вывести на консоль день недели по заданной дате, рассчитать количество дней, месяцев в заданном временном промежутке.

21. Создать объект класса Сутки, используя классы Час, Минута. Методы:

вывести на консоль текущее время, рассчитать время суток (утро, день, вечер, ночь).

22. Создать объект класса Птица, используя классы Крылья, Клюв. Методы: летать, садиться, питаться, атаковать.

23. Создать объект класса Хищник, используя классы Когти, Зубы. Методы: рычать, бежать, спать, добывать пищу.

24. Создать объект класса Гитара, используя класс Струна, Скворечник.

Методы: играть, настраивать, заменять струну.

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.