Комментарии (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 делает:
- Выделение памяти в heap
- Инициализация полей значениями по умолчанию (0, null, false)
- Вызов конструктора с переданными параметрами
- Возврат ссылки на созданный объект
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.
Механизм:
- JVM выделяет память
- Инициализирует поля значениями по умолчанию
- Вызывает конструктор с параметрами
- Возвращает ссылку на объект
Это отличается от:
- Вызова метода:
user.getName() - Вызова функции:
calculateTotal(10, 20) - Вызова конструктора напрямую: используется
new