Что переходит от Object по наследованию
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Наследование от Object: Методы и поведение
Что такое java.lang.Object?
Object - это базовый класс всех классов в Java. Каждый класс автоматически наследуется от Object, даже если ты не указываешь явно.
// Эти две записи эквивалентны
public class MyClass {} // неявно extends Object
public class MyClass extends Object {} // явно
// Все классы наследуют методы Object
MyClass obj = new MyClass();
obj.toString(); // Из Object
obj.equals(obj); // Из Object
obj.hashCode(); // Из Object
Методы, наследуемые от Object
1. toString()
Описание: возвращает строковое представление объекта.
По умолчанию: ClassName@hashCode
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + "'" +
", age=" + age +
"}";
}
}
2. equals(Object obj)
Описание: проверяет, равны ли два объекта.
По умолчанию: сравнивает ссылки (как ==).
public class Product {
private Long id;
private String name;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Product product = (Product) obj;
return Objects.equals(this.id, product.id);
}
}
3. hashCode()
Описание: возвращает хеш-код объекта.
ВАЖНО: Переопределяй ВСЕГДА, когда переопределяешь equals().
public class Account {
private String accountNumber;
@Override
public int hashCode() {
return Objects.hash(accountNumber);
}
}
Contract: Если два объекта equal, их hashCode должны быть одинаковы.
4. clone()
Описание: создаёт копию объекта.
public class Document implements Cloneable {
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
5. getClass()
Описание: возвращает объект Class этого объекта.
User user = new User("Alice", 25);
Class<?> clazz = user.getClass();
System.out.println(clazz.getSimpleName()); // User
6. wait(), notify(), notifyAll()
Описание: методы для синхронизации потоков.
synchronized (lock) {
lock.wait(); // Ждёт
lock.notifyAll(); // Пробуждает ждущие потоки
}
7. finalize() (DEPRECATED)
Статус: DEPRECATED с Java 9. НЕ ИСПОЛЬЗУЙ!
Используй try-with-resources с AutoCloseable вместо этого.
Сравнительная таблица
| Метод | Обычно переопределяется | Назначение |
|---|---|---|
| toString() | Да | Строковое представление |
| equals() | Да (если нужно) | Сравнение объектов |
| hashCode() | Да (с equals) | Коллекции HashMap/HashSet |
| clone() | Редко | Копирование объектов |
| getClass() | Нет | Рефлексия |
| wait/notify | Нет | Синхронизация потоков |
| finalize() | Нет (deprecated) | Не использовать |
Best Practices
✅ Делай так:
public class Proper {
private String id;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Proper other = (Proper) obj;
return Objects.equals(this.id, other.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return "Proper{id=" + id + "}";
}
}
❌ Не делай так:
- Переопределяй equals без hashCode
- Забывай null check в toString
- Используй finalize()
- Забывай о контракте equals-hashCode
Заключение
Все классы наследуют методы Object. Три самых важных:
- equals() - для семантического сравнения
- hashCode() - для работы с коллекциями
- toString() - для отладки
Всегда переопределяй equals() и hashCode() вместе!