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

С чего начинается верхушка класса

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

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Верхушка иерархии классов Java: Object класс

Определение верхушки класса

Верхушка иерархии классов Java — это класс java.lang.Object. Это единственный класс, который не имеет суперкласса, и он является прямым или косвенным суперклассом для всех остальных классов в Java.

Основная концепция

// Все эти классы наследуются от Object
public class MyClass extends Object { }
public class Person { } // Неявно extends Object
String str = "hello"; // Неявно extends Object
int[] arr = {1, 2, 3}; // Массивы тоже наследуют Object

Визуализация иерархии

                         java.lang.Object (верхушка)
                                |
                ________________|_______________________________
                |                |                |             |
           java.lang.Class   java.lang.Number  java.lang.String ...
                |                |                |
            ________         _______|______    ________
            |      |         |     |     |     |      |
           byte  short      int  long double  Date  StringBuilder

Методы класса Object

Все классы наследуют 11 методов из Object:

1. equals(Object obj)

public class Person {
    private String name;
    private int age;
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;  // Идентичность объектов
        if (obj == null) return false; // Null проверка
        if (!(obj instanceof Person)) return false; // Тип проверка
        
        Person other = (Person) obj;
        return this.name.equals(other.name) && 
               this.age == other.age;
    }
}

Person p1 = new Person("John", 30);
Person p2 = new Person("John", 30);
person p3 = p1;

p1.equals(p2); // true — по значению
p1 == p2;      // false — разные объекты в памяти
p1 == p3;      // true — один и тот же объект

По умолчанию: сравнивает ссылки (==)

2. hashCode()

public class Person {
    private String name;
    private int age;
    
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

// Использование в HashMap/HashSet
Set<Person> people = new HashSet<>();
people.add(new Person("John", 30));

// Поиск использует hashCode для быстрого поиска
boolean found = people.contains(new Person("John", 30));

Контракт: если a.equals(b), то a.hashCode() == b.hashCode()

3. toString()

public class Person {
    @Override
    public String toString() {
        return String.format("Person{name='%s', age=%d}", name, age);
    }
}

Person p = new Person("Alice", 25);
System.out.println(p); // Person{name='Alice', age=25}

По умолчанию: возвращает ClassName@hashCode

4. getClass()

Object obj = new String("hello");
Class<?> clazz = obj.getClass();

System.out.println(clazz.getName()); // java.lang.String
System.out.println(clazz.getSimpleName()); // String

// Runtime type checking
if (obj.getClass() == String.class) {
    String str = (String) obj;
}

5. clone()

public class Person implements Cloneable {
    private String name;
    private int age;
    
    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone(); // Shallow copy
    }
}

Person original = new Person("Bob", 40);
Person copy = original.clone();

copy.setName("Alice"); // Не влияет на original

Shallow copy: копирует только примитивы и ссылки, не сам объект

6. finalize()

public class Resource {
    private Connection connection;
    
    @Deprecated(since = "9")
    @Override
    protected void finalize() throws Throwable {
        try {
            connection.close(); // Очистка ресурсов
        } finally {
            super.finalize();
        }
    }
}

Устарело: вместо этого используйте AutoCloseable и try-with-resources

7-11. Методы синхронизации

public class Counter {
    private int count = 0;
    
    public synchronized void increment() {
        count++; // synchronized использует monitor из Object
    }
    
    public void waitForZero() throws InterruptedException {
        synchronized (this) {
            while (count != 0) {
                this.wait(); // Object.wait()
            }
        }
    }
    
    public void reset() {
        synchronized (this) {
            count = 0;
            this.notifyAll(); // Object.notifyAll()
        }
    }
}

Методы:

  • wait() — ждёт уведомления
  • notify() — пробуждает один поток
  • notifyAll() — пробуждает все потоки

Важные выводы

1. Все объекты — экземпляры Object

Object obj1 = new String("hello");
Object obj2 = new ArrayList<>();
Object obj3 = new Thread();
// Все это — Object

2. Полиморфизм через Object

public void printObjects(Object[] objs) {
    for (Object obj : objs) {
        System.out.println(obj.toString());
        System.out.println(obj.hashCode());
        System.out.println(obj.getClass().getName());
    }
}

Object[] mixed = {
    "String",
    42,
    new Person("John", 30),
    new ArrayList<>()
};

printObjects(mixed); // Работает с любыми объектами

3. Переопределение методов Object

Практически всегда нужно переопределять:

  • equals() — для правильного сравнения
  • hashCode() — если используется в HashMap/HashSet
  • toString() — для удобного отлога
record Person(String name, int age) {
    // Record автоматически реализует equals, hashCode, toString
}

// Эквивалентно часам кода для классов!

4. Pattern Matching с Object

public String describe(Object obj) {
    if (obj instanceof String str) {
        return "String: " + str;
    } else if (obj instanceof Integer num) {
        return "Integer: " + num;
    } else if (obj instanceof List<?> list) {
        return "List with " + list.size() + " items";
    }
    return "Unknown: " + obj.getClass().getSimpleName();
}

Заключение

java.lang.Object — это фундамент Java типизации. Понимание его методов критично для:

  • Правильной работы с коллекциями (HashMap требует hashCode/equals)
  • Многопоточной синхронизации (wait/notify)
  • Сравнения объектов
  • Рефлексии и runtime типирования

Это один из самых важных классов в Java, хотя его часто воспринимают как само собой разумеющееся.

С чего начинается верхушка класса | PrepBro