Объектно-ориентированное программирование в Java (ООП). Практические Задания
1. Класс Phone.
- Создайте класс
Phone, который содержит переменныеnumber,modelиweight. - Создайте три экземпляра этого класса.
- Выведите на консоль значения их переменных.
- Добавить в класс
Phoneметоды:receiveCall, имеет один параметр – имя звонящего. Выводит на консоль сообщение “Звонит {name}”. МетодgetNumber– возвращает номер телефона. Вызвать эти методы для каждого из объектов. - Добавить конструктор в класс
Phone, который принимает на вход три параметра для инициализации переменных класса -number,modelиweight. - Добавить конструктор, который принимает на вход два параметра для инициализации переменных класса -
number,model. - Добавить конструктор без параметров.
- Вызвать из конструктора с тремя параметрами конструктор с двумя.
- Добавьте перегруженный метод
receiveCall, который принимает два параметра - имя звонящего и номер телефона звонящего. Вызвать этот метод. - Создать метод
sendMessageс аргументами переменной длины. Данный метод принимает на вход номера телефонов, которым будет отправлено сообщение. Метод выводит на консоль номера этих телефонов. - Изменить класс
Phoneв соответствии с концепцией JavaBean.
Смотрите решение задачи в видео 1, видео 2, видео 3, видео 4, видео 5.
2. Класс Person
Создать класс Person, который содержит:
- переменные
fullName,age; - методы
move()иtalk(), в которых просто вывести на консоль сообщение -"Такой-то Person говорит". - Добавьте два конструктора -
Person()иPerson(fullName, age). - Создайте два объекта этого класса. Один объект инициализируется конструктором
Person(), другой -Person(fullName, age). - Вызовите методы
move()иtalk().
3. Класс Матрица
Создать класс "Матрица". Класс должен иметь следующие переменные:
- двумерный массив вещественных чисел;
- количество строк и столбцов в матрице.
Класс должен иметь следующие методы:
- сложение с другой матрицей;
- умножение на число;
- вывод на печать;
- умножение матриц.
4. Читатели библиотеки
Определить класс Reader, хранящий такую информацию о пользователе библиотеки:
- ФИО,
- номер читательского билета,
- факультет,
- дата рождения,
- телефон.
- Методы
takeBook(),returnBook(). - Разработать программу, в которой создается массив объектов данного класса.
- Перегрузить методы
takeBook(),returnBook():
-takeBook, который будет принимать количество взятых книг. Выводит на консоль сообщение "Петров В. В. взял 3 книги".
-takeBook, который будет принимать переменное количество названий книг. Выводит на консоль сообщение "Петров В. В. взял книги: Приключения, Словарь, Энциклопедия".
-takeBook, который будет принимать переменное количество объектов класса Book (создать новый класс, содержащий имя и автора книги). Выводит на консоль сообщение "Петров В. В. взял книги: Приключения, Словарь, Энциклопедия". - Аналогичным образом перегрузить метод
returnBook(). Выводит на консоль сообщение "Петров В. В. вернул книги: Приключения, Словарь, Энциклопедия". Или "Петров В. В. вернул 3 книги".
5. Рекурсивный вывод чисел
Даны два целых числа A и В. Выведите все числа от A до B включительно, в порядке возрастания, если A < B, или в порядке убывания в противном случае. Использовать рекурсию.
6. Наследование Student, Aspirant
- Создайте пример наследования, реализуйте класс
Studentи классAspirant, аспирант отличается от студента наличием некой научной работы. - Класс
Studentсодержит переменные:String firstName,lastName,group. А также,double averageMark, содержащую среднюю оценку. - Создать метод
getScholarship()для классаStudent, который возвращает сумму стипендии. Если средняя оценка студента равна 5, то сумма 2000 грн, иначе 1900. Переопределить этот метод в классеAspirant. Если средняя оценка аспиранта равна 5, то сумма 2500 грн, иначе 2200. - Создать массив типа
Student, содержащий объекты классаStudentиAspirant. Вызвать методgetScholarship()для каждого элемента массива.
Смотрите решение задачи в видео 1, видео 2.
7. Автомобили
- Создать класс
Carв пакетеcom.company.vehicles,Engineв пакетеcom.company.detailsиDriverв пакетеcom.company.professions. - Класс
Driverсодержит поля - ФИО, стаж вождения. - Класс
Engineсодержит поля - мощность, производитель. - Класс
Carсодержит поля - марка автомобиля, класс автомобиля, вес, водитель типаDriver, мотор типаEngine. Методыstart(),stop(),turnRight(),turnLeft(), которые выводят на печать: "Поехали", "Останавливаемся", "Поворот направо" или "Поворот налево". А также методtoString(), который выводит полную информацию об автомобиле, ее водителе и моторе. - Создать производный от
Carкласс -Lorry(грузовик), характеризуемый также грузоподъемностью кузова. - Создать производный от
Carкласс -SportCar, характеризуемый также предельной скоростью. - Пусть класс
Driverрасширяет классPerson.

8. Животные
- Создать класс
Animalи расширяющие его абстрактные классыDog,Cat,Bear. - Класс
Animalсодержит переменнуюnameи абстрактные методыmakeNoise,eat,getDescription. МетодmakeNoise, например, может выводить на консоль звуки животных. Методeatвыводит на консоль список того, чем питается данное животное. МетодgetDescriptionвозвращает описание животного. Dog,Cat,Bearпереопределяют методыmakeNoise,eat,getDescription.- Создайте класс
Ветеринар, в котором определите методvoid treatAnimal(Animal animal). Пусть этот метод распечатываетnameи описание пришедшего на прием животного. - В методе
mainсоздайте массив типаAnimal, в который запишите животных всех имеющихся у вас типов. В цикле отправляйте их на прием к ветеринару. В отдельном цикле вызовите методыmakeNoise,eatдля каждого животного.
9. Уровни доступа
- Заполнить табличку.
Уровни доступа № Ситуация private default protected public 1 Один и тот же класс 2 Подкласс, находящийся в том же пакете, что и суперкласс 3 Класс из того же самого пакета, не являющийся подклассом 4 Подкласс, находящийся в другом пакете 5 Класс из другого пакета, не являющийся подклассом данного - Создать классы для заполнения таблицы.
10. Фигуры
- Создайте абстрактный класс
Shapeи его наследниковCircle,Rectangle. - Класс
Shapeсодержит абстрактный методdraw()и переменную, хранящую цвет. - Классы
Circle,Rectangleсодержат координаты точек. - Создать массив, содержащий эти фигуры.
- В цикле нарисовать их (вызвать метод
draw).
11. Интернет-магазин, часть 1
- Создать класс
Товар, имеющий переменныеимя,цена,рейтинг. - Создать класс
Категория, имеющий переменныеимяи массивтоваров. Создать несколько объектов классаКатегория. - Создать класс
Basket, содержащий массив купленных товаров. - Создать класс
User, содержащий логин, пароль и объект классаBasket. Создать несколько объектов классаUser. - Вывести на консоль каталог продуктов.
- Вывести на консоль покупки посетителей магазина.
Про задания 12-17
Эти шесть заданий добавлены отдельно и закрывают темы, которые раньше не были представлены практикой в этом разделе: this, передачу объектов в методы, стек/кучу, сборщик мусора, super и final. Специально просите компилятор выдать ошибку там, где написано "убедитесь, что код не компилируется" — на собеседованиях по Java это одни из самых частых вопросов на понимание, а не на знание синтаксиса.
12. Ключевое слово this: банковский счёт
- Создать класс
BankAccountс полямиString ownerиdouble balance. - Добавить конструктор
BankAccount(String owner, double balance), у которого имена параметров совпадают с именами полей. Внутри конструктора использоватьthis.owner = owner;иthis.balance = balance;, чтобы явно отличить поле объекта от локального параметра. - Добавить метод
deposit(double balance)— имя параметра снова совпадает с именем поля. Внутри метода прибавить сумму к балансу объекта черезthis.balance += balance;. - Добавить метод
BankAccount richerThan(BankAccount other), который сравниваетthis.balanceиother.balanceи возвращает тот из двух объектов (thisилиother), у которого баланс больше. Это задание показывает, чтоthis— не только способ обратиться к полю, а ссылка на текущий объект целиком. - В
mainсоздать два объектаBankAccount, вызватьdepositу каждого, затем вызватьricherThanи вывести владельца счёта с большим балансом.
13. Передача объектов в методы: Counter
- Создать класс
Counterс единственным полемint value. - Написать метод
increment(Counter c), который увеличиваетc.valueна 1. Вызвать его для объекта изmainи убедиться, что изменение поля видно снаружи метода — объект передаётся по ссылке, и метод меняет тот же объект, на который ссылается вызывающий код. - Написать метод
reset(Counter c), который присваивает параметру новый объект:c = new Counter();. Вызвать его и убедиться, что переменная вmainНЕ изменилась — сама ссылка передаётся в метод по значению, поэтому переприсваивание параметра внутри метода не затрагивает переменную вызывающего кода. - Вывести на консоль значение
valueдо и после каждого вызова и в комментарии в коде объяснить разницу в поведении междуincrementиreset.
14. Стек, куча и StackOverflowError
- Написать метод
printCountdown(int n), который выводитnна консоль и рекурсивно вызывает сам себя сn - 1, но БЕЗ базового случая (условия остановки). - Запустить метод и получить
java.lang.StackOverflowError. В комментарии объяснить, почему это происходит: под каждый вызов метода в стеке выделяется отдельный фрейм с локальными переменными и адресом возврата, а размер стека потока ограничен и не резиновый. - Исправить метод, добавив базовый случай (например,
if (n <= 0) return;), и убедиться, что теперь он завершается корректно. - Создать класс
Pointс полямиx,yи вmainв цикле создать несколько объектовPoint, сохраняя их в массив. В комментарии указать, где хранятся сами объектыPoint(куча) и где хранится переменная-ссылка на массив (стек методаmain).
15. Сборщик мусора и метод finalize
- Создать класс
Resourceс полемString nameи переопределённым методомprotected void finalize() throws Throwable, который выводит на консоль"Освобождён ресурс: " + nameи вызываетsuper.finalize(). - В
mainв цикле создать несколько объектовResource, не сохраняя на них ссылки за пределами тела цикла (либо явно присвоить переменнойnullпосле использования), затем вызватьSystem.gc(). - В комментарии объяснить: вызов
finalize()не гарантирован и непредсказуем по времени — это лишь подсказка сборщику мусора, а не команда освободить память немедленно. - Отдельно в комментарии указать, что начиная с Java 9 метод
finalize()объявлен deprecated (а в Java 18 фактически отключён по умолчанию), и в реальном коде для освобождения ресурсов используютtry-with-resourcesи интерфейсAutoCloseable, а неfinalize().
16. Ключевое слово super: Vehicle и Bicycle
- Создать класс
Vehicleс полемString name, конструкторомVehicle(String name)и методомprintInfo(), который выводит на консоль"Транспортное средство: " + name. - Создать класс
Bicycle extends Vehicleс дополнительным полемint gearsCount. В конструктореBicycle(String name, int gearsCount)первой строкой явно вызватьsuper(name)для инициализации поля родителя. - Переопределить в
BicycleметодprintInfo(): сначала вызватьsuper.printInfo(), затем дополнительно вывести количество передач. - В
mainсоздать объектBicycleи вызватьprintInfo()— убедиться, что выводятся обе строки: и родительская, и добавленная в наследнике.
17. Ключевое слово final: константы, классы, методы, параметры
- Создать класс
MathConstantsс полемpublic static final double PI = 3.14159;. Попробовать в другом месте кода присвоить этому полю новое значение, убедиться, что код не компилируется, закомментировать эту строку и объяснить ошибку компиляции в комментарии. - Создать
final-классSecurityUtilsс одним статическим методом. Попробовать написать класс, наследующий отSecurityUtils, убедиться, что компилятор выдаёт ошибку, и объяснить, зачем классу вообще может понадобитьсяfinal(например, чтобы гарантировать неизменность поведения, как у классаString). - В классе
Vehicleиз задания 16 объявить методprintInfo()какfinal. Попробовать переопределить его в классеBicycleи убедиться, что это невозможно. - Написать метод с
final-параметром, напримерvoid process(final int value), и попробовать внутри метода присвоитьvalueновое значение — убедиться, что это ошибка компиляции.
При написании программ обращайте внимание на рекомендации по оформлению кода.
Часто задаваемые вопросы
В чём разница между вызовом this(...) и super(...) в конструкторе?
this(...) вызывает другой конструктор ТОГО ЖЕ класса (например, конструктор с тремя параметрами вызывает конструктор с двумя, как в задании 1). super(...) вызывает конструктор родительского класса, как в задании 16. Оба вызова, если присутствуют, обязаны быть первой строкой конструктора, и вместе в одном конструкторе они использоваться не могут — либо this(...), либо super(...), не оба сразу.
Почему объект, переданный в метод, можно изменить, а переменную-объект целиком заменить нельзя?
В Java аргументы всегда передаются по значению, но для объектов этим значением является ссылка (адрес). Метод получает копию ссылки на тот же объект в куче, поэтому изменение его полей (как в задании 13 с increment) видно снаружи. А присвоение параметру нового объекта (как в reset) меняет только локальную копию ссылки внутри метода, не затрагивая переменную вызывающего кода.
Стоит ли использовать finalize() для освобождения ресурсов в реальном проекте?
Нет. Метод finalize() не гарантирует ни момент вызова, ни сам факт вызова, объявлен deprecated начиная с Java 9 и фактически отключён по умолчанию в Java 18+. Для файлов, соединений с БД и сетевых сокетов используйте try-with-resources и интерфейс AutoCloseable — они освобождают ресурс детерминированно, сразу при выходе из блока.
Если переменная-ссылка объявлена final, можно ли менять поля объекта, на который она указывает?
Да. final у ссылочной переменной запрещает переприсвоить саму ссылку (указывать на другой объект), но не делает объект неизменяемым. Поля объекта, если у них есть публичные сеттеры или они не final, можно менять как обычно. Настоящая неизменяемость объекта — это отдельная задача проектирования класса (final-поля, отсутствие сеттеров), а не следствие final у переменной.
Комментарии