← Назад к вопросам

Расскажи про иерархию базовых классов

1.2 Junior🔥 201 комментариев
#ООП#Основы Java

Комментарии (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.