В Java все классы неявно наследуют от Object, получая базовые методы. Три ключевых метода, которые часто переопределяют:
toString()— возвращает строковое представление объекта. По умолчанию выводит имя класса и хеш, что малоинформативно.equals(Object obj)— сравнивает объекты по содержимому. Без переопределения сравнивает ссылки (как==).hashCode()— возвращает числовой хеш объекта. Контракт: еслиequals()возвращаетtrue, хеш-коды обязаны совпадать.
На этом интерактивном тренажёре вы попрактикуетесь в переопределении этих методов. Задания помогут понять, зачем нужен каждый метод и как они связаны между собой.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Переопределение toString()
Дополните код класса Person, переопределив метод toString(). Вставьте пропущенные элементы: аннотацию для переопределения метода, ключевое слово возврата и обращения к полям name и age. Метод должен возвращать строку в формате "Person{name='[name]', age=[age]}".
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
input1S
public String toString() {
input2S "Person{name='" + input3S + "', age=" + input4S + "}";
}
}2. Ошибка в методе equals()
В приведённом классе Person реализован метод equals() для сравнения объектов по полю name. Однако в коде допущена типичная ошибка, которая приведёт к некорректному сравнению объектов — два объекта Person с одинаковыми именами могут быть признаны неравными. Найдите строку с ошибкой и исправьте её.
public class Person { private String name; @Override public boolean equals(Object obj) { if (obj == null) return false; Person other = (Person) obj; return name == other.name; }}3. Что вернёт equals()?
Проанализируйте приведённый код на Java. В классе Person переопределён метод equals(), который сравнивает объекты только по полю id. В методе main создаются два объекта Person с одинаковым id, но разными значениями полей name и age. Что будет выведено на экран в результате выполнения метода main?
class Person {
private int id;
private String name;
private int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return id == person.id;
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person(1, "Alice", 25);
Person p2 = new Person(1, "Bob", 30);
System.out.println(p1.equals(p2));
}
}4. Методы Object и их назначение
В левой колонке представлены методы класса Object — базового класса для всех объектов в Java. В правой колонке указаны описания назначения этих методов. Сопоставьте каждый метод с его корректным описанием. Каждому методу соответствует ровно одно описание, а порядок вариантов в правой колонке перемешан.
toString()equals()hashCode()getClass()clone()5. Собери метод hashCode()
Из предложенных строк соберите корректный метод hashCode() для класса Person с полями name (String) и age (int). Метод должен переопределять стандартный hashCode() из класса Object и использовать утилитный метод Objects.hash() для вычисления хеш-кода на основе полей объекта. Некоторые строки являются лишними и не должны входить в решение.
@Overridepublic int hashCode() { return Objects.hash(name, age);} return super.hashCode();public boolean hashCode() {6. Найди переопределённые методы
Перед вами класс Product на языке Java. В нём определено несколько методов: одни являются переопределением методов класса Object, другие — собственными методами этого класса. Внимательно изучите код и отметьте все методы, которые переопределяют методы класса Object. Собственные методы класса (геттеры, сеттеры, бизнес-методы) и конструктор отмечать не нужно.
public class Product {
private String name;
private double price;
{{public Product(String name, double price)~|~t1}} {
this.name = name;
this.price = price;
}
{{public String getName()~|~t2}} {
return name;
}
{{public void setPrice(double price)~|~t3}} {
this.price = price;
}
{{public double calculateDiscount(int percent)~|~t4}} {
return price * (100 - percent) / 100;
}
@Override
{{public String toString()~|~t5}} {
return "Product{name='" + name + "', price=" + price + "}";
}
@Override
{{public boolean equals(Object obj)~|~t6}} {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Product other = (Product) obj;
return name.equals(other.name);
}
@Override
{{public int hashCode()~|~t7}} {
return Objects.hash(name);
}
}7. Контракт equals и hashCode
Рассмотрите приведённый ниже код класса Person, в котором переопределён метод equals(). Этот метод сравнивает объекты только по полю name, игнорируя поле age. В методе main создаются два объекта с одинаковым именем, но разным возрастом, и для них вызывается equals(), который возвращает true. Согласно контракту между equals() и hashCode() в Java, если equals() для двух объектов возвращает true, должны ли их хэш-коды, возвращаемые методом hashCode(), быть равны? Введите ответ в поле ниже (одно слово: 'да' или 'true' для утвердительного ответа, 'нет' или 'false' для отрицательного).
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
// Сравниваем только по полю name, игнорируя age
return Objects.equals(name, person.name);
}
// Метод hashCode() НЕ переопределён
// Используется реализация по умолчанию из Object
public static void main(String[] args) {
Person p1 = new Person("Анна", 25);
Person p2 = new Person("Анна", 30);
System.out.println("p1.equals(p2) = " + p1.equals(p2));
// Выведет: p1.equals(p2) = true
}
}