ООП ·
‹ Предыдущий Следующий ›
⏱ 5 минут чтения Обновлено: 2026-08-09

Объектно-ориентированное программирование в Java (ООП). Практические Задания

1. Класс Phone.

  1. Создайте класс Phone, который содержит переменные number, model и weight.
  2. Создайте три экземпляра этого класса. 
  3. Выведите на консоль значения их переменных. 
  4. Добавить в класс Phone методы: receiveCall, имеет один параметр – имя звонящего. Выводит на консоль сообщение “Звонит {name}”. Метод getNumber – возвращает номер телефона. Вызвать эти методы для каждого из объектов.
  5. Добавить конструктор в класс Phone, который принимает на вход три параметра для инициализации переменных класса - number, model и weight
  6. Добавить конструктор, который принимает на вход два параметра для инициализации переменных класса - number, model
  7. Добавить конструктор без параметров.
  8. Вызвать из конструктора с тремя параметрами конструктор с двумя. 
  9. Добавьте перегруженный метод receiveCall, который принимает два параметра - имя звонящего и номер телефона звонящего. Вызвать этот метод.
  10. Создать метод sendMessage с аргументами переменной длины. Данный метод принимает на вход номера телефонов, которым будет отправлено сообщение. Метод выводит на консоль номера этих телефонов.
  11. Изменить класс Phone в соответствии с концепцией JavaBean.

Смотрите решение задачи в видео 1, видео 2, видео 3, видео 4, видео 5.

Решение на Patreon →

2. Класс Person

Создать класс Person, который содержит: 

  1. переменные fullName, age;
  2. методы move() и talk(), в которых просто вывести на консоль сообщение -"Такой-то  Person говорит". 
  3. Добавьте два конструктора  - Person() и Person(fullName, age).
  4. Создайте два объекта этого класса. Один объект инициализируется конструктором Person(), другой - Person(fullName, age).
  5. Вызовите методы move() и talk().

Решение на Patreon →

3. Класс Матрица

Создать класс "Матрица". Класс должен иметь следующие переменные:

  1. двумерный массив вещественных чисел;
  2. количество строк и столбцов в матрице.

Класс должен иметь следующие методы:

  1. сложение с другой матрицей;
  2. умножение на число;
  3. вывод на печать; 
  4. умножение матриц.

Решение на Patreon →

4. Читатели библиотеки

Определить класс Reader, хранящий такую информацию о пользователе библиотеки:

  1. ФИО,
  2. номер читательского билета,
  3. факультет,
  4. дата рождения,
  5. телефон.
  6. Методы takeBook(), returnBook().
  7. Разработать программу, в которой создается массив объектов данного класса.
  8. Перегрузить методы takeBook(), returnBook():
    takeBook, который будет принимать количество взятых книг. Выводит на консоль сообщение "Петров В. В. взял 3 книги".
    takeBook, который будет принимать переменное количество названий книг. Выводит на консоль сообщение "Петров В. В. взял книги: Приключения, Словарь, Энциклопедия".
    takeBook, который будет принимать переменное количество объектов класса Book (создать новый класс, содержащий имя и автора книги). Выводит на консоль сообщение "Петров В. В. взял книги: Приключения, Словарь, Энциклопедия".
  9.  Аналогичным образом перегрузить метод returnBook(). Выводит на консоль сообщение "Петров В. В. вернул книги: Приключения, Словарь, Энциклопедия". Или  "Петров В. В. вернул 3 книги".

Решение на Patreon →

5. Рекурсивный вывод чисел

Даны два целых числа A и В. Выведите все числа от A до B включительно, в порядке возрастания, если A < B, или в порядке убывания в противном случае. Использовать рекурсию.

Решение на Patreon →

6. Наследование Student, Aspirant

  1. Создайте пример наследования, реализуйте класс Student и класс Aspirant, аспирант отличается от студента наличием некой научной работы.
  2. Класс Student содержит переменные: String firstName, lastName, group. А также, double averageMark, содержащую среднюю оценку.
  3. Создать метод getScholarship() для класса Student, который возвращает сумму стипендии. Если средняя оценка студента равна 5, то сумма 2000 грн, иначе 1900. Переопределить этот метод в классе Aspirant.  Если средняя оценка аспиранта равна 5, то сумма 2500 грн, иначе 2200.
  4. Создать массив типа Student, содержащий объекты класса Student и Aspirant. Вызвать метод getScholarship() для каждого элемента массива.

Смотрите решение задачи в видео 1, видео 2.

Решение на Patreon →

7. Автомобили

  1. Создать класс Car в пакете com.company.vehiclesEngine в пакете com.company.details и Driver в пакете com.company.professions.
  2. Класс Driver содержит поля - ФИО, стаж вождения.
  3. Класс Engine содержит поля - мощность, производитель.
  4. Класс Car содержит поля - марка автомобиля, класс автомобиля, вес, водитель типа Driver, мотор типа Engine. Методы start(), stop()turnRight(), turnLeft(), которые выводят на печать: "Поехали", "Останавливаемся", "Поворот направо" или "Поворот налево". А также метод toString(), который выводит полную информацию об автомобиле, ее водителе и моторе. 
  5. Создать производный от Car класс  - Lorry (грузовик), характеризуемый также грузоподъемностью кузова.
  6. Создать производный от Car класс - SportCar, характеризуемый также предельной скоростью.
  7. Пусть класс Driver расширяет класс Person.

Иерархия классов фото

Решение на Patreon →

8. Животные

  1. Создать класс Animal и расширяющие его абстрактные классы Dog, Cat, Bear.
  2. Класс Animal содержит переменную name и абстрактные методы makeNoiseeatgetDescription. Метод makeNoiseнапример, может выводить на консоль звуки животных. Метод  eat выводит на консоль список того, чем питается данное животное. Метод getDescription возвращает описание животного.
  3. Dog, Cat, Bear переопределяют методы makeNoiseeat, getDescription.
  4. Создайте класс Ветеринар, в котором определите метод void treatAnimal(Animal animal)Пусть этот метод распечатывает name и описание пришедшего на прием животного.
  5. В методе main создайте массив типа Animal, в который запишите животных всех имеющихся у вас типов. В цикле отправляйте их на прием к ветеринару. В отдельном цикле вызовите методы  makeNoiseeat для каждого животного.

Решение на Patreon →

9. Уровни доступа

  1. Заполнить табличку.
    Уровни доступа
    Ситуация private default protected public
    1 Один и тот же класс        
    2 Подкласс, находящийся в том же пакете, что и суперкласс        
    3 Класс из того же самого пакета, не являющийся подклассом        
    4 Подкласс, находящийся в другом пакете        
    5 Класс из другого пакета, не являющийся подклассом данного        
  2. Создать классы для заполнения таблицы.

Решение на Patreon →

10. Фигуры

  1. Создайте абстрактный класс Shape и его наследников CircleRectangle.
  2. Класс Shape содержит абстрактный метод draw() и переменную, хранящую цвет.
  3. Классы CircleRectangle содержат координаты точек.
  4. Создать массив, содержащий эти фигуры.
  5. В цикле нарисовать их (вызвать метод draw).

Решение на Patreon →

11. Интернет-магазин, часть 1

  1. Создать класс Товаримеющий переменные имя, цена, рейтинг. 
  2. Создать класс Категория, имеющий переменные имя и массив товаров. Создать несколько объектов класса Категория
  3. Создать класс Basket, содержащий массив купленных товаров. 
  4. Создать класс User, содержащий логин, пароль и объект класса Basket. Создать несколько объектов класса User.
  5. Вывести на консоль каталог продуктов.
  6. Вывести на консоль покупки посетителей магазина.

Решение на Patreon →

Про задания 12-17

Эти шесть заданий добавлены отдельно и закрывают темы, которые раньше не были представлены практикой в этом разделе: this, передачу объектов в методы, стек/кучу, сборщик мусора, super и final. Специально просите компилятор выдать ошибку там, где написано "убедитесь, что код не компилируется" — на собеседованиях по Java это одни из самых частых вопросов на понимание, а не на знание синтаксиса.

12. Ключевое слово this: банковский счёт

  1. Создать класс BankAccount с полями String owner и double balance.
  2. Добавить конструктор BankAccount(String owner, double balance), у которого имена параметров совпадают с именами полей. Внутри конструктора использовать this.owner = owner; и this.balance = balance;, чтобы явно отличить поле объекта от локального параметра.
  3. Добавить метод deposit(double balance) — имя параметра снова совпадает с именем поля. Внутри метода прибавить сумму к балансу объекта через this.balance += balance;.
  4. Добавить метод BankAccount richerThan(BankAccount other), который сравнивает this.balance и other.balance и возвращает тот из двух объектов (this или other), у которого баланс больше. Это задание показывает, что this — не только способ обратиться к полю, а ссылка на текущий объект целиком.
  5. В main создать два объекта BankAccount, вызвать deposit у каждого, затем вызвать richerThan и вывести владельца счёта с большим балансом.

13. Передача объектов в методы: Counter

  1. Создать класс Counter с единственным полем int value.
  2. Написать метод increment(Counter c), который увеличивает c.value на 1. Вызвать его для объекта из main и убедиться, что изменение поля видно снаружи метода — объект передаётся по ссылке, и метод меняет тот же объект, на который ссылается вызывающий код.
  3. Написать метод reset(Counter c), который присваивает параметру новый объект: c = new Counter();. Вызвать его и убедиться, что переменная в main НЕ изменилась — сама ссылка передаётся в метод по значению, поэтому переприсваивание параметра внутри метода не затрагивает переменную вызывающего кода.
  4. Вывести на консоль значение value до и после каждого вызова и в комментарии в коде объяснить разницу в поведении между increment и reset.

14. Стек, куча и StackOverflowError

  1. Написать метод printCountdown(int n), который выводит n на консоль и рекурсивно вызывает сам себя с n - 1, но БЕЗ базового случая (условия остановки).
  2. Запустить метод и получить java.lang.StackOverflowError. В комментарии объяснить, почему это происходит: под каждый вызов метода в стеке выделяется отдельный фрейм с локальными переменными и адресом возврата, а размер стека потока ограничен и не резиновый.
  3. Исправить метод, добавив базовый случай (например, if (n <= 0) return;), и убедиться, что теперь он завершается корректно.
  4. Создать класс Point с полями x, y и в main в цикле создать несколько объектов Point, сохраняя их в массив. В комментарии указать, где хранятся сами объекты Point (куча) и где хранится переменная-ссылка на массив (стек метода main).

15. Сборщик мусора и метод finalize

  1. Создать класс Resource с полем String name и переопределённым методом protected void finalize() throws Throwable, который выводит на консоль "Освобождён ресурс: " + name и вызывает super.finalize().
  2. В main в цикле создать несколько объектов Resource, не сохраняя на них ссылки за пределами тела цикла (либо явно присвоить переменной null после использования), затем вызвать System.gc().
  3. В комментарии объяснить: вызов finalize() не гарантирован и непредсказуем по времени — это лишь подсказка сборщику мусора, а не команда освободить память немедленно.
  4. Отдельно в комментарии указать, что начиная с Java 9 метод finalize() объявлен deprecated (а в Java 18 фактически отключён по умолчанию), и в реальном коде для освобождения ресурсов используют try-with-resources и интерфейс AutoCloseable, а не finalize().

16. Ключевое слово super: Vehicle и Bicycle

  1. Создать класс Vehicle с полем String name, конструктором Vehicle(String name) и методом printInfo(), который выводит на консоль "Транспортное средство: " + name.
  2. Создать класс Bicycle extends Vehicle с дополнительным полем int gearsCount. В конструкторе Bicycle(String name, int gearsCount) первой строкой явно вызвать super(name) для инициализации поля родителя.
  3. Переопределить в Bicycle метод printInfo(): сначала вызвать super.printInfo(), затем дополнительно вывести количество передач.
  4. В main создать объект Bicycle и вызвать printInfo() — убедиться, что выводятся обе строки: и родительская, и добавленная в наследнике.

17. Ключевое слово final: константы, классы, методы, параметры

  1. Создать класс MathConstants с полем public static final double PI = 3.14159;. Попробовать в другом месте кода присвоить этому полю новое значение, убедиться, что код не компилируется, закомментировать эту строку и объяснить ошибку компиляции в комментарии.
  2. Создать final-класс SecurityUtils с одним статическим методом. Попробовать написать класс, наследующий от SecurityUtils, убедиться, что компилятор выдаёт ошибку, и объяснить, зачем классу вообще может понадобиться final (например, чтобы гарантировать неизменность поведения, как у класса String).
  3. В классе Vehicle из задания 16 объявить метод printInfo() как final. Попробовать переопределить его в классе Bicycle и убедиться, что это невозможно.
  4. Написать метод с 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 у переменной.

Комментарии

oliver_s Sep 27, 2020
А решение етсь ? Чтобы проверить!
milkina Sep 27, 2020
Нет, пока не выложили в общий доступ.
telfagor Nov 21, 2020
Выложите пожалуйста правильное решение задач, чтобы можно было сверить свое с правильной, не у всех есть кого спросить
milkina Nov 24, 2020
Выложим в ближайшем будущем.
dexarte Dec 10, 2020
Можно узнать ответы?
12121vodiass Dec 11, 2020
Ответы уже появились ?
milkina Dec 12, 2020
Решение задачи 4 - https://www.examclouds.com/ru/java/java-core-russian/task-answers-oop
Click_2003 Apr 26, 2021
Почему их до сих пор нет ?
Apr 28, 2021
Добавлено решение по задаче "Автомобили". Смотрите на https://www.examclouds.com/ru/java/java-core-russian/task-answers-oop .
Jexly Jan 21, 2022
Задача насчет библиотеки. В задаче не написано, что нужно создать три разных человека, а в решении вы создаете. Умницы
Jan 22, 2022
Jexly, это по желанию.
Tubach Nov 6, 2022
Дайте пожалуйста краткий Алгоритм решения задачи с Интернет магазином. Возникают вопросы на этапе Корзины с товарами
milkina Dec 2, 2022
Решение по 10. Интернет магазин, часть 1 выложено на patreon - https://www.patreon.com/posts/75420086
unknown Mar 4, 2023
А где можно еще посмотреть ответы кроме Patreon, а то не дает зайти.
milkina Mar 4, 2023
На udemy - https://www.udemy.com/course/java-bup/

Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.