Какова иерархия базовых классов в Java?

Ответ

В Java существует единый корень иерархии классов — java.lang.Object. Все классы, для которых не указан явный родитель, неявно наследуются от Object.

Ключевые классы верхнего уровня:

  1. Object — корневой класс. Содержит фундаментальные методы, общие для всех объектов:

    • boolean equals(Object obj) — для логического сравнения объектов.
    • int hashCode() — возвращает хэш-код, должен быть согласован с equals().
    • String toString() — возвращает строковое представление объекта.
    • Class<?> getClass() — возвращает метаинформацию о классе объекта (runtime class).
    • protected Object clone() — создает копию объекта.
    • void wait(), void notify(), void notifyAll() — методы для синхронизации потоков.
  2. Number (абстрактный) — является родителем для всех классов-оберток примитивных числовых типов: Integer, Double, Long, Float, Byte, Short. Предоставляет методы для конвертации в примитивные типы (например, intValue(), doubleValue()).

  3. Throwable — базовый класс для всей иерархии исключений и ошибок. Имеет два основных прямых потомка:

    • Error — указывает на серьезные проблемы, которые приложение не должно пытаться обрабатывать (например, OutOfMemoryError).
    • Exception — исключения, которые приложение может и должно обрабатывать. Включает проверяемые (IOException) и непроверяемые (RuntimeException) исключения.

Пример и демонстрация наследования от Object:

// Класс MyClass неявно наследует Object
class MyClass {
    private int value;
    // Конструктор, геттеры, сеттеры...
}

MyClass obj = new MyClass();
System.out.println(obj.toString()); // Вызовется MyClass.toString() или, если он не переопределен, реализация по умолчанию из Object
System.out.println(obj.getClass().getName()); // Выведет "MyClass"

Ответ 18+ 🔞

Слушай, а вот есть в Java такая хуйня, как единый папаша для всех классов — java.lang.Object. Это типа как у всех людей общий предок — обезьяна, только тут не обезьяна, а Object. Если ты свой класс написал и не указал, от кого он рожается, то он автоматом, по умолчанию, наследуется от этого самого Object. Прямо как в жизни — если не знаешь, кто отец, значит, отец — государство, то есть Object.

Главные шишки на верхушке этой ёбаной иерархии:

  1. Object — он же корень, он же голова. Там внутри сидят методы, которые есть у всех объектов, даже у твоего кота, если бы он был написан на Java.

    • boolean equals(Object obj) — чтобы сравнивать, не хуй ли собачий. Обычно его переписывают, потому что стандартная реализация сравнивает просто ссылки, а это пиздец как неудобно.
    • int hashCode() — выдаёт хэш-код. Важное правило, блядь: если переопределил equals, переопредели и hashCode, а то в HashMap твой объект потеряется, и будешь потом ебаться как проклятый.
    • String toString() — чтобы объект мог сам про себя рассказать строкой. По умолчанию он выдаёт какую-то хуйню вроде MyClass@15db9742, что, конечно, нихуя не информативно.
    • Class<?> getClass() — этот метод, блядь, как паспорт. Говорит: «Я объект такого-то класса, ёпта!». Возвращает метаинформацию, runtime class, короче.
    • protected Object clone() — пытается скопировать объект. Работает через жопу, если сам не настроишь, поэтому многие его не любят.
    • void wait(), void notify(), void notifyAll() — это уже для взрослых дядек, которые работают с потоками. Синхронизация, блядь, сложная штука.
  2. Number (абстрактный, ёпта) — это типа общий предок для всех этих классов-обёрток над примитивами: Integer, Double, Long и прочих. Он нужен, чтобы можно было, например, в коллекцию положить разные числа и потом достать их как int или double через методы intValue(), doubleValue().

  3. Throwable — вот это, блядь, основа основ для всей этой кучи исключений, которые летят в твою программу. У него два главных отпрыска:

    • Error — это уже пиздец полный. OutOfMemoryError, например. Это не ошибка программы, это конец света. Ловить такое — бесполезное занятие, только попрощаться с приложением.
    • Exception — а вот это уже наша тема. Исключения, которые можно и нужно ловить. Тут внутри ещё есть RuntimeException (непроверяемые, летят когда хотят) и всякие IOException (проверяемые, компилятор заставляет их обрабатывать).

Вот смотри, как это всё работает на примере, блядь:

// Класс MyClass. Отец не указан, значит, папа — Object. Всё просто.
class MyClass {
    private int value;
    // ... тут конструктор, геттеры, сеттеры, всякая хуйня
}

MyClass obj = new MyClass();
System.out.println(obj.toString()); // Вызовется либо наш кастомный toString(), либо дефолтный от Object, если мы ленивые жопы.
System.out.println(obj.getClass().getName()); // Выведет "MyClass". Спросили — кто ты? Он ответил.

Вот и вся магия, ёпта. Object — он везде, как воздух. Ты его не видишь, но без него нихуя не работает.