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

Как понимаешь "вызов класса"

1.0 Junior🔥 41 комментариев
#Основы Java

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

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

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

# "Вызов класса" в Java: Создание объектов

Что означает "вызов класса"

В Java "вызов класса" означает создание экземпляра класса с помощью оператора new. Это вызывает конструктор класса и инициализирует объект в памяти.

1. Базовая форма: new + Constructor

// Определение класса
public class User {
    private String name;
    private int age;
    
    // Конструктор (вызывается при new User)
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

// ВЫЗОВ КЛАССА (создание объекта)
User user = new User("Alice", 25);
//^ оператор new
//          ^----^ конструктор с параметрами

2. Процесс при вызове класса

Когда пишешь new User("Alice", 25), JVM делает:

  1. Выделение памяти в heap
  2. Инициализация полей значениями по умолчанию (0, null, false)
  3. Вызов конструктора с переданными параметрами
  4. Возврат ссылки на созданный объект
User user = new User("Alice", 25);

За кулисами:

1. JVM выделила память для User (например, адрес 0x1a2b3c)
2. Инициализировала поля:
   - name = null
   - age = 0
3. Вызвала конструктор:
   - this.name = "Alice"
   - this.age = 25
4. Вернула ссылку на этот объект в переменную user

3. Конструкторы (различные типы)

Конструктор по умолчанию (Default Constructor)

public class Car {
    // Если не определить конструктор, Java создаёт пустой по умолчанию
    // public Car() { }
}

// Вызов
Car car = new Car();  // Работает

Явно определённый конструктор

public class Car {
    private String brand;
    
    public Car(String brand) {
        this.brand = brand;
    }
}

Car car = new Car("Toyota");

Несколько конструкторов (перегрузка)

public class Car {
    private String brand;
    private int year;
    
    // Конструктор 1
    public Car(String brand) {
        this.brand = brand;
        this.year = 0;
    }
    
    // Конструктор 2
    public Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
    }
}

Car car1 = new Car("Toyota");              // Вызывает конструктор 1
Car car2 = new Car("Toyota", 2023);        // Вызывает конструктор 2

Конструктор с this()

public class Car {
    private String brand;
    private int year;
    
    public Car(String brand) {
        this(brand, 0);  // Вызывает другой конструктор
    }
    
    public Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
    }
}

4. Super() — вызов конструктора родителя

public class Vehicle {
    protected String type;
    
    public Vehicle(String type) {
        this.type = type;
    }
}

public class Car extends Vehicle {
    private String brand;
    
    public Car(String type, String brand) {
        super(type);  // Вызов конструктора родителя
        this.brand = brand;
    }
}

// Вызов
Car car = new Car("sedan", "Toyota");
// 1. Сначала вызовется super("sedan")
// 2. Потом выполнится код Car

5. Factory Pattern (альтернативный способ создания)

public class UserFactory {
    
    // Статический метод — "фабрика"
    public static User createAdminUser(String name) {
        User user = new User(name, 0);
        user.setRole("ADMIN");
        return user;
    }
    
    public static User createRegularUser(String name) {
        User user = new User(name, 0);
        user.setRole("USER");
        return user;
    }
}

// Использование (тоже "вызов", но косвенно)
User admin = UserFactory.createAdminUser("Alice");
User regular = UserFactory.createRegularUser("Bob");

6. Reflection — динамический вызов класса

// Вызов класса через Reflection
Class<?> clazz = Class.forName("com.example.User");
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object user = constructor.newInstance("Alice", 25);

7. Initialization block (инициализационный блок)

public class User {
    private String name;
    private List<String> roles;
    
    // Инициализационный блок
    {
        roles = new ArrayList<>();  // Выполняется ПЕРЕД конструктором
    }
    
    public User(String name) {
        this.name = name;  // Конструктор выполняется ПОСЛЕ
    }
}

// При вызове new User("Alice"):
// 1. Инициализационный блок: roles = new ArrayList()
// 2. Конструктор: name = "Alice"

8. Порядок инициализации класса

public class Demo {
    static int staticField = initStatic();        // 1st: static field init
    
    static {
        System.out.println("Static block");       // 2nd: static block
    }
    
    int instanceField = initInstance();           // 3rd: instance field init
    
    {
        System.out.println("Instance block");     // 4th: instance block
    }
    
    public Demo() {
        System.out.println("Constructor");        // 5th: constructor
    }
    
    static int initStatic() {
        System.out.println("Init static");
        return 1;
    }
    
    int initInstance() {
        System.out.println("Init instance");
        return 1;
    }
}

// При вызове new Demo():
// Output:
// Init static      (загрузка класса)
// Static block
// Init instance    (создание объекта)
// Instance block
// Constructor

9. Immutable объекты (неизменяемые после создания)

public final class Point {
    private final int x;
    private final int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
        // После вызова конструктора объект больше не меняется
    }
    
    public int getX() { return x; }
    public int getY() { return y; }
}

Point p = new Point(10, 20);  // После этого p никогда не изменится

10. Проблемы при вызове класса

Исключение в конструкторе

public class Database {
    public Database(String url) {
        if (!url.startsWith("jdbc:")) {
            throw new IllegalArgumentException("Invalid URL");
        }
    }
}

Database db = new Database("invalid");  // Выбросит исключение

NullPointerException

User user = null;
user.getName();  // NPE — объект не был создан (not called)

User user = new User("Alice");  // Объект создан (class called)
user.getName();  // OK

Key Takeaways

"Вызов класса" = создание объекта через конструктор с помощью оператора new.

Механизм:

  1. JVM выделяет память
  2. Инициализирует поля значениями по умолчанию
  3. Вызывает конструктор с параметрами
  4. Возвращает ссылку на объект

Это отличается от:

  • Вызова метода: user.getName()
  • Вызова функции: calculateTotal(10, 20)
  • Вызова конструктора напрямую: используется new