Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Расскажи про иерархию базовых классов
Иерархия класса Object в Java
Object (java.lang.Object)
↑
│ Все классы наследуют Object
│
┌────┴────┬──────────┬──────────┬──────────┐
│ │ │ │ │
Class String Number Throwable Collections
│ │ │ │
│ │ ┌─────┴──────┐ │
│ │ │ │ │
│ StringBuilder Integer Long
│ Float Double
│
Throwable
├── Exception
│ ├── IOException
│ ├── SQLException
│ └── RuntimeException
│ ├── NullPointerException
│ ├── IndexOutOfBoundsException
│ └── IllegalArgumentException
└── Error
├── OutOfMemoryError
├── StackOverflowError
└── VirtualMachineError
1. Класс Object - корень иерархии
java.lang.Object — базовый класс для всех классов в Java. Каждый класс прямо или косвенно наследует Object.
// Явное наследование
public class User extends Object { }
// Неявное наследование (если не указан другой parent)
public class User {
// Автоматически наследует Object
}
// При наследовании другого класса
public class Employee extends User {
// Через User наследует Object
}
Основные методы Object
2. toString() - строковое представление
@Override
public String toString() {
return "Object of " + getClass().getSimpleName();
}
// Примеры
Integer num = 42;
System.out.println(num.toString()); // "42"
LocalDate date = LocalDate.now();
System.out.println(date.toString()); // "2024-03-23"
User user = new User("John", 30);
System.out.println(user); // Вызывает toString()
// Результат: User@15db9742 (если не переопределён)
3. equals() - сравнение объектов
// ❌ По умолчанию сравнивает по ссылке (==)
public class User {
private String name;
private int age;
}
User user1 = new User("John", 30);
User user2 = new User("John", 30);
user1.equals(user2); // false! Разные ссылки
// ✅ Правильное переопределение equals
@Override
public boolean equals(Object obj) {
// 1. Проверка ссылки
if (this == obj) return true;
// 2. Проверка null
if (obj == null) return false;
// 3. Проверка типа
if (!(obj instanceof User)) return false;
// 4. Приведение типа и сравнение полей
User other = (User) obj;
return Objects.equals(this.name, other.name) &&
this.age == other.age;
}
// Или с Java 14+ record
public record User(String name, int age) {
// equals() и hashCode() генерируются автоматически
}
4. hashCode() - хеш-код объекта
// Контракт equals-hashCode
// Если equals() вернул true, то hashCode() должны быть равны
@Override
public int hashCode() {
return Objects.hash(name, age);
}
// Использование в HashMap
Map<User, String> userMap = new HashMap<>();
User user1 = new User("John", 30);
User user2 = new User("John", 30);
userMap.put(user1, "Developer");
userMap.put(user2, "Developer");
System.out.println(userMap.size()); // 1 (если equals правильно переопределён)
// ❌ Если не переопределить hashCode
System.out.println(userMap.size()); // 2 (разные хеши)
5. getClass() - получить класс объекта
User user = new User("John", 30);
Class<?> clazz = user.getClass();
System.out.println(clazz.getSimpleName()); // "User"
System.out.println(clazz.getName()); // "com.example.User"
// Использование для instanceof проверки
if (user.getClass() == User.class) {
System.out.println("Это ровно User, не подкласс");
}
// Получить конструктор
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
User newUser = (User) constructor.newInstance("Jane", 25);
6. clone() - копирование объекта
// ⚠️ Требует реализации Cloneable интерфейса
public class User implements Cloneable {
private String name;
private int age;
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone(); // Поверхностное копирование
}
}
// Использование
User original = new User("John", 30);
User copy = original.clone();
// ⚠️ Проблема - поверхностное копирование
public class User implements Cloneable {
private String name;
private Address address; // Объект
@Override
public User clone() throws CloneNotSupportedException {
User cloned = (User) super.clone();
// ПРОБЛЕМА: address - та же ссылка!
// Нужно глубокое копирование
cloned.address = new Address(address.getCity());
return cloned;
}
}
7. finalize() - финализация объекта
// ❌ УСТАРЕЛО с Java 9, будет удалено в Java 18+
@Deprecated(since = "9", forRemoval = true)
public class Resource implements AutoCloseable {
private FileInputStream stream;
@Override
public void finalize() {
// Вызывается перед сборкой мусора
// ПЛОХО: неопределённое время выполнения
}
// ✅ ПРАВИЛЬНО - используй AutoCloseable
@Override
public void close() {
stream.close();
}
}
// Использование
try (Resource res = new Resource()) {
res.doWork();
} // close() вызывается автоматически
Иерархия типов исключений
Throwable
↙ ↘
Exception Error
↙ ↓ ↘ ↙ ↓ ↘
...
Checked Exceptions (должны обрабатываться):
├── IOException
├── SQLException
├── ClassNotFoundException
└── Custom Exception extends Exception
Unchecked Exceptions (могут не обрабатываться):
├── RuntimeException
│ ├── NullPointerException
│ ├── IndexOutOfBoundsException
│ ├── IllegalArgumentException
│ └── UnsupportedOperationException
└── Error (SystemError)
├── OutOfMemoryError
├── StackOverflowError
└── VirtualMachineError
Иерархия Collection классов
Iterable
↑
Collection
╱ ╲ ╲
List Set Queue
╱ ╲ ╱ ╲ ╱ ╲
ArrayList Queue HashSet Deque
LinkedList LinkedList TreeSet
Array
Deque
Map (отдельная иерархия)
├── HashMap
├── TreeMap
├── LinkedHashMap
└── ConcurrentHashMap
Иерархия Runnable/Thread
Runnable (interface)
↑
│ implements
│
Thread
↙ ↓ ↘
VirtualThread (Java 21+)
ThreadGroup
...
Практический пример: Полная иерархия
public class User implements Cloneable, Comparable<User> {
private final String name; // immutable
private int age;
public User(String name, int age) {
this.name = Objects.requireNonNull(name);
this.age = age;
}
// equals() из Object
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return age == user.age && name.equals(user.name);
}
// hashCode() из Object
@Override
public int hashCode() {
return Objects.hash(name, age);
}
// toString() из Object
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// Comparable интерфейс
@Override
public int compareTo(User other) {
return Integer.compare(this.age, other.age);
}
// clone() из Object
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
Резюме иерархии базовых классов
Object (корень всех классов)
- toString() — строковое представление
- equals() — логическое сравнение
- hashCode() — хеш для Collections
- getClass() — метаинформация
- clone() — копирование (мало используется)
- finalize() — устарело
Throwable (все исключения)
- Exception — checked exceptions
- Error — неисправимые ошибки JVM
Collection иерархия — List, Set, Queue, Map
Всегда переопределяй equals() и hashCode() вместе для корректной работы с Collections.