Какой класс является корневым родителем для всех классов в Java?

Ответ

Корневым родителем для всех классов в Java является класс java.lang.Object.

Ключевые моменты:

  • Если класс не указывает явного родителя через ключевое слово extends, он неявно наследуется от Object.
  • Даже если класс наследуется от другого, цепочка наследования в итоге ведёт к Object.
  • Класс Object предоставляет набор стандартных методов, которые есть у любого объекта:
    • equals() — для сравнения объектов.
    • hashCode() — возвращает хэш-код объекта.
    • toString() — возвращает строковое представление объекта.
    • getClass() — возвращает объект класса Class данного объекта.

Пример:

// MyClass неявно наследуется от Object
class MyClass {
    // Поля и методы класса
}

// Это эквивалентно явному наследованию:
class MyClass extends Object {
    // Поля и методы класса
}

Исключение: Примитивные типы (int, char, boolean и др.) не являются классами и, соответственно, не наследуются от Object.

Ответ 18+ 🔞

А, слушай, вот это тема, про которую все вроде знают, но потом, блядь, на собеседовании про hashCode() с equals() спрашивают — и тут же пиздец, волнение ебать, в рот меня чих-пых, язык отнимается.

Так вот, смотри. Вся эта твоя Java-вселенная, она, сука, иерархична. И на самом верху, как бог-отец, сидит ёбаный java.lang.Object.

Суть в трёх пунктах, запоминай:

  1. Ты пишешь class MyClass { ... } и думаешь, что ты независимый гений? Хуй там! Твой класс автоматом, неявно, по умолчанию наследуется от Object. Это как налоги — от них не отвертишься.
  2. Даже если твой класс уже от кого-то наследуется (extends SuperClass), то его родитель, в свою очередь, тоже от кого-то наследуется. И эта цепочка, блядь, как матрёшка, всегда-всегда упирается в Object. Он — корень, пиздец, альфа и омега.
  3. А зачем он, этот Object? А затем, что он даёт каждому объекту стандартный набор пиздюлей... то есть, методов! Без них никуда:
    • equals() — чтобы сравнивать, один ли это объект или два разных, но с одинаковыми полями. А то == нихуя не всегда работает как надо.
    • hashCode() — эта, блядь, магическая цифра, которая должна быть связана с equals(). Забудешь про связь — в HashMap твой объект потеряется нахуй навсегда.
    • toString() — чтобы при выводе в консоль было не MyClass@a1b2c3, а что-то человекочитаемое. Ну, если переопределишь, конечно.
    • getClass() — чтобы узнать, под какой, блядь, личиной этот объект пришёл.

Пример, чтобы совсем доехало:

// Пишешь так, спокойно
class MyClass {
    int value;
}
// А Java видит это так, ёпта:
class MyClass extends Object {
    int value;
}
// И теперь у каждого экземпляра MyClass есть методы от дедушки Object. Всё, приехали.

Важный нюанс, блядь! Примитивные типы вроде int, char — это не объекты, это так, голые данные. Они от Object нихуя не наследуются. Они как дикари в цивилизованном мире объектов. Но для них есть обёртки (Integer, Character), вот они-то — полноценные объекты и внуки того самого Object. Вот такая, блядь, хитрая жопа.