Лабораторная работа 2: Объектно-ориентированное программирование в Java
Цель работы
Изучение основ объектно-ориентированного программирования на Java: создание классов, объектов, работа с инкапсуляцией, организация взаимодействия между классами, разделение ответственности между классами.
Формулировка задач
Задание 1. Точка координат
Создайте сущность Точка, расположенную на двумерной плоскости, которая описывается:
· Координата Х: число · Координата Y: число · Может возвращать текстовое представление вида "{X;Y}"
Необходимо создать три точки с разными координатами и вывести на экран их текстовое представление.
Задание 2. Прямая
Создайте сущность Линия, расположенную на двумерной плоскости, которая описывается:
· Координата начала: Точка · Координата конца: Точка · Может возвращать текстовое представление вида "Линия от {X1;Y1} до {X2;Y2}"
Для указания координат нужно использовать сущность Точка, разработанную в задании 1.1. Создайте линии со следующими характеристиками:
- Линия 1 с началом в т. {1;3} и концом в т.{23;8}.
- Линия 2, горизонтальная, на высоте 10, от точки 5 до точки 25.
- Линия 3, которая начинается всегда там же, где начинается линия 1, и заканчивается всегда там же, где заканчивается линия 2. Таким образом, если положение первой или второй линии меняется, то меняется и третья линия.
- После создания всех трех объектов измените координаты первой и второй линий, причем сделайте это таким образом, чтобы положение третьей линии соответствовало требованиям пункта 3.
- Измените координаты первой линии так, чтобы при этом не изменились координаты третьей линии.
Задание 3. Студент
Создайте сущность Студент, которая описывается:
· Имя: строка · Оценки: массив целых чисел. · Может возвращать текстовое представление вида "Имя: [оценка1, оценка2,...,оценкаN]"
Необходимо выполнить следующие задачи:
- Создать студента Васю с оценками: 3,4,5.
- Создать студента Петю и скопировать оценки Васи, присвоив содержимое поля с оценками Васи полю с оценками Пети.
- Заменить первую оценку Пети на число 5. Вывести на экран строковое представление Васи и Пети. Объяснить результат
- Создать студента Андрея и скопировать ему оценки Васи так, чтобы изменение оценок Васи не влияло на Андрея.
Задание 4. Создаем Точку и Линию
Создаем Точку. Измените сущность Точка из задачи 1.1.В соответствии с новыми требованиями создать объект Точки можно только путем указания обеих координат: X и Y.
Необходимо выполнить следующие задачи:
· Создайте и выведите на экран точку с координатами 3;5 · Создайте и выведите на экран точку с координатами 25;6 · Создайте и выведите на экран точку с координатами 7;8
Создаем Линию. Измените сущность Линия из задачи 2.1.Новые требования включают:
· Создание Линии возможно с указанием Точки начала и Точки конца (Точки из задачи 4.1)
Создайте линии со следующими характеристиками:
- Линия 1 с началом в т. {1;3} и концом в {23;8}.
- Линия 2, горизонтальная, на высоте 10, от точки 5 до точки 25.
- Линия 3 которая начинается всегда там же где начинается линия 1, и заканчивается всегда там же, где заканчивается линия 2.
Задание 5. Пистолет стреляет
Создайте сущность Пистолет, которая описывается следующим образом:
· Имеет Количество патронов (целое число) · Может быть создан с указанием начального количества патронов · Может быть создан без указания начального количества патронов, в этом случае он изначально заряжен пятью патронами. · Может Стрелять, что приводит к выводу на экран текста "Бах!" в том случае, если количество патронов больше нуля, иначе делает "Клац!". После каждого выстрела (когда вывелся "Бах!") количество патронов уменьшается на один.
Создайте пистолет с тремя патронами и выстрелите из него пять раз.
Описание программы
Программа представляет собой консольное приложение с интерактивным меню, позволяющим тестировать функциональность всех реализованных классов. Проект организован по принципу разделения ответственности: главный класс Main управляет меню и пользовательским взаимодействием, а класс TaskManager содержит логику выполнения всех заданий.
Программа обеспечивает:
· Безопасный ввод данных с обработкой исключений · Дружественный пользовательский интерфейс · Наглядную демонстрацию работы всех методов и классов · Проверку корректности вводимых данных · Чистую архитектуру с разделением ответственности
Структура проекта
Проект состоит из 6 классов, каждый в отдельном файле:
- Point.java - класс, представляющий точку на плоскости
- Line.java - класс, представляющий линию на плоскости
- Student.java - класс, представляющий студента с оценками
- Gun.java - класс, представляющий пистолет с патронами
- TaskManager.java - класс, содержащий логику выполнения всех заданий
- Main.java - главный класс с меню и управлением программой
Архитектура программы
Принцип разделения ответственности
Программа реализована с соблюдением принципа единственной ответственности (Single Responsibility Principle):
· Main.java - отвечает только за управление меню и пользовательским вводом · TaskManager.java - содержит всю бизнес-логику выполнения заданий · Point/Line/Student/Gun - представляют предметную область и данные
Взаимодействие классов
Main → TaskManager → (Point, Line, Student, Gun)
· Main делегирует выполнение заданий TaskManager · TaskManager использует предметные классы для демонстрации ООП концепций · Все классы независимы и могут использоваться отдельно
Реализация задач и методы решения
Задание 1: Точка координат
Методы решения:
· Создан класс Point с приватными полями x и y типа double · Реализован конструктор для инициализации координат · Реализованы геттеры и сеттеры для доступа к координатам · Переопределен метод toString() для возврата строки формата "{X;Y}"
Код реализации:
public class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
@Override
public String toString() {
return "{" + x + ";" + y + "}";
}
}
Задание 2: Прямая
Методы решения:
· Создан класс Line с полями start и end типа Point · Реализован конструктор для инициализации точек начала и конца · Реализованы геттеры и сеттеры для точек · Переопределен метод toString() для форматированного вывода
Код реализации:
public class Line {
private Point start;
private Point end;
public Line(Point start, Point end) {
this.start = start;
this.end = end;
}
public Point getStart() {
return start;
}
public Point getEnd() {
return end;
}
public void setStart(Point start) {
this.start = start;
}
public void setEnd(Point end) {
this.end = end;
}
@Override
public String toString() {
return "Линия от " + start + " до " + end;
}
}
Задание 3: Студент
Методы решения:
· Создан класс Student с полями name (String) и grades (int[]) · Конструктор создает копию массива оценок для защиты от внешних изменений · Геттер возвращает копию массива, а не оригинал (глубокое копирование) · Реализован метод toString() для красивого вывода оценок
Код реализации:
public class Student {
private String name;
private int[] grades;
public Student(String name, int[] grades) {
this.name = name;
// Создаём копию массива, чтобы избежать изменений извне
this.grades = grades.clone();
}
public String getName() {
return name;
}
public int[] getGrades() {
// Возвращаем копию массива, чтобы его нельзя было изменить извне
return grades.clone();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(name).append(": [");
for (int i = 0; i < grades.length; i++) {
sb.append(grades[i]);
if (i < grades.length - 1) sb.append(", ");
}
sb.append("]");
return sb.toString();
}
}
Задание 5: Пистолет стреляет
Методы решения:
· Создан класс Gun с полем bullets (int) · Реализованы два конструктора: по умолчанию (5 патронов) и с параметром · Метод shoot() проверяет наличие патронов и выводит соответствующие сообщения · Реализован метод toString() для отображения состояния пистолета
Код реализации:
public class Gun {
private int bullets;
public Gun() {
this.bullets = 5;
}
public Gun(int bullets) {
this.bullets = bullets;
}
public void shoot() {
if (bullets > 0) {
System.out.println("Бах!");
bullets--;
} else {
System.out.println("Клац!");
}
}
public int getBullets() {
return bullets;
}
@Override
public String toString() {
return "Пистолет с " + bullets + " патронами";
}
}
Класс TaskManager
Назначение:
· Содержит всю логику выполнения заданий · Обеспечивает безопасный ввод данных · Изолирует бизнес-логику от пользовательского интерфейса
Ключевые методы:
public class TaskManager {
// Вспомогательные методы для безопасного ввода
public static int readInt(Scanner scanner) {
while (true) {
try {
return Integer.parseInt(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.print("Пожалуйста, введите число: ");
}
}
}
public static double readDouble(Scanner scanner) {
while (true) {
try {
return Double.parseDouble(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.print("Некорректный ввод. Пожалуйста, введите число: ");
}
}
}
// Методы выполнения заданий
public static void task1(Scanner scanner) { ... }
public static void task2() { ... }
public static void task3() { ... }
public static void task4() { ... }
public static void task5() { ... }
}
Главный класс Main
Назначение:
· Управление пользовательским интерфейсом · Навигация по меню · Координация работы всей программы
Код реализации:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean exit = false;
while (!exit) {
System.out.println("=== Меню заданий ===");
System.out.println("1. Задание 1 - Точка координат");
System.out.println("2. Задание 2 - Прямая");
System.out.println("3. Задание 3 - Студент");
System.out.println("4. Задание 4 - Создаем Точку и Линию");
System.out.println("5. Задание 5 - Пистолет стреляет");
System.out.println("0. Выход");
System.out.print("Выберите задание: ");
int choice = TaskManager.readInt(scanner);
switch (choice) {
case 1:
TaskManager.task1(scanner);
break;
case 2:
TaskManager.task2();
break;
case 3:
TaskManager.task3();
break;
case 4:
TaskManager.task4();
break;
case 5:
TaskManager.task5();
break;
case 0:
exit = true;
System.out.println("Выход из программы.");
break;
default:
System.out.println("Неверный выбор. Попробуйте снова.");
}
}
scanner.close();
}
}
Демонстрация ключевых концепций ООП
- Инкапсуляция
Все поля классов объявлены как private, доступ осуществляется через геттеры и сеттеры:
private double x; // Инкапсуляция данных
public double getX() { return x; } // Контролируемый доступ
public void setX(double x) { this.x = x; } // Контролируемое изменение
- Наследование
Использование наследования через @Override методов Object:
@Override
public String toString() {
return "{" + x + ";" + y + "}";
}
- Полиморфизм
Разные реализации метода toString() в каждом классе:
// Point
return "{" + x + ";" + y + "}";
// Line
return "Линия от " + start + " до " + end;
// Student
return name + ": [" + ... + "]";
// Gun
return "Пистолет с " + bullets + " патронами";
Тестирование программы
Тестирование Задания 1 ✅
Входные данные:
Введите X1: 2.5
Введите Y1: 3.7
Введите X2: 10.0
Введите Y2: 15.2
Введите X3: 7.3
Введите Y3: 4.8
Результат:
{2.5;3.7}
{10.0;15.2}
{7.3;4.8}
Вывод: Задание выполнено успешно. Точки создаются корректно, текстовое представление соответствует формату.
Тестирование Задание 2 ✅
Результат выполнения:
Линия от {1.0;3.0} до {23.0;8.0}
Линия от {5.0;10.0} до {25.0;10.0}
Линия от {1.0;3.0} до {25.0;10.0}
После изменения координат:
Линия от {2.0;4.0} до {23.0;8.0}
Линия от {5.0;10.0} до {30.0;12.0}
Линия от {2.0;4.0} до {30.0;12.0}
После изменения начала линии 1:
Линия от {10.0;10.0} до {23.0;8.0}
Линия от {2.0;4.0} до {30.0;12.0}
Вывод: Задание выполнено успешно. Демонстрируется работа с ссылками и изменение связанных объектов.
Тестирование Задание 3 ✅
Результат выполнения:
Вася: [3, 4, 5]
Петя: [5, 4, 5]
Андрей: [3, 4, 5]
Изменение оценок Пети не повлияло на Васю и Андрея, потому что использовалась копия массива.
Вывод: Задание выполнено успешно. Продемонстрирована работа с глубоким копированием массивов и защита данных.
Тестирование Задание 4 ✅
Результат выполнения:
Точка 1:{3.0;5.0}
Точка 2:{25.0;6.0}
Точка 3:{7.0;8.0}
Линия от {1.0;3.0} до {23.0;8.0}
Линия от {5.0;10.0} до {25.0;10.0}
Линия от {1.0;3.0} до {25.0;10.0}
Вывод: Задание выполнено успешно. Объекты создаются корректно через конструкторы.
Тестирование Задание 5 ✅
Результат выполнения:
Бах!
Бах!
Бах!
Клац!
Клац!
Вывод: Задание выполнено успешно. Пистолет корректно обрабатывает выстрелы при наличии и отсутствии патронов.