Ответ
В Java существует единый корень иерархии классов — java.lang.Object. Все классы, для которых не указан явный родитель, неявно наследуются от Object.
Ключевые классы верхнего уровня:
-
Object— корневой класс. Содержит фундаментальные методы, общие для всех объектов:boolean equals(Object obj)— для логического сравнения объектов.int hashCode()— возвращает хэш-код, должен быть согласован сequals().String toString()— возвращает строковое представление объекта.Class<?> getClass()— возвращает метаинформацию о классе объекта (runtime class).protected Object clone()— создает копию объекта.void wait(),void notify(),void notifyAll()— методы для синхронизации потоков.
-
Number(абстрактный) — является родителем для всех классов-оберток примитивных числовых типов:Integer,Double,Long,Float,Byte,Short. Предоставляет методы для конвертации в примитивные типы (например,intValue(),doubleValue()). -
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.
Главные шишки на верхушке этой ёбаной иерархии:
-
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()— это уже для взрослых дядек, которые работают с потоками. Синхронизация, блядь, сложная штука.
-
Number(абстрактный, ёпта) — это типа общий предок для всех этих классов-обёрток над примитивами:Integer,Double,Longи прочих. Он нужен, чтобы можно было, например, в коллекцию положить разные числа и потом достать их какintилиdoubleчерез методыintValue(),doubleValue(). -
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 — он везде, как воздух. Ты его не видишь, но без него нихуя не работает.