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

Какие знаешь методы класса по умолчанию?

2.3 Middle🔥 191 комментариев
#Базы данных и SQL

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

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

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

Методы класса по умолчанию в Java

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

Основные методы Object

1. toString()

Возвращает строковое представление объекта. По умолчанию возвращает строку в формате ClassName@hashCode:

Object obj = new Object();
System.out.println(obj.toString()); // java.lang.Object@7ad041f

Обычно переопределяют для вывода осмысленной информации об объекте:

class Person {
    String name;
    int age;
    
    @Override
    public String toString() {
        return "Person{" + "name='" + name + "'" + 
               ", age=" + age + "}";
    }
}

2. equals(Object obj)

Сравнивает содержимое двух объектов. По умолчанию использует сравнение по ссылке (==):

String str1 = new String("Java");
String str2 = new String("Java");

System.out.println(str1 == str2);        // false (разные ссылки)
System.out.println(str1.equals(str2));   // true (одинаковое содержимое)

Часто переопределяют для логического сравнения:

class Book {
    String isbn;
    String title;
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        
        Book book = (Book) obj;
        return isbn.equals(book.isbn);
    }
}

3. hashCode()

Возвращает хеш-код объекта — целое число, используемое в коллекциях (HashMap, HashSet). Важно переопределять вместе с equals():

@Override
public int hashCode() {
    return isbn.hashCode();
}

Контракт hashCode():

  • Если a.equals(b), то a.hashCode() == b.hashCode()
  • Если a.hashCode() != b.hashCode(), то !a.equals(b)

4. getClass()

Возвращает объект Class, содержащий информацию о классе при runtime:

String str = "Hello";
Class<?> clazz = str.getClass();
System.out.println(clazz.getName()); // java.lang.String

5. clone()

Создаёт поверхностную копию объекта. Требует имплементации интерфейса Cloneable:

class Person implements Cloneable {
    String name;
    
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

6. wait(), notify(), notifyAll()

Используются для синхронизации потоков. Позволяют потокам ждать определённых условий:

synchronized void waitForSignal() throws InterruptedException {
    wait();
}

synchronized void sendSignal() {
    notify();
    notifyAll();
}

7. finalize()

Вызывается Garbage Collector перед удалением объекта. Используется редко (устарел с Java 9):

@Override
protected void finalize() throws Throwable {
    System.out.println("Объект удаляется");
    super.finalize();
}

Практический пример

class Employee {
    private int id;
    private String name;
    
    @Override
    public String toString() {
        return String.format("Employee[id=%d, name='%s']", id, name);
    }
    
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Employee)) return false;
        Employee emp = (Employee) obj;
        return this.id == emp.id;
    }
    
    @Override
    public int hashCode() {
        return Integer.hashCode(id);
    }
}

Эти методы — фундамент работы с объектами в Java. Их переопределение — обычная практика для правильного поведения пользовательских классов в коллекциях и при логировании.