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

В чем разница между классом и объектом?

1.2 Junior🔥 221 комментариев
#ООП

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

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

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

Разница между классом и объектом

Это одна из самых фундаментальных концепций объектно-ориентированного программирования. Класс — это шаблон или чертёж, а объект — это конкретный экземпляр этого шаблона.

Класс — это шаблон

// Класс — описание структуры и поведения
public class Car {
    // Атрибуты (свойства)
    private String brand;      // Какой бренд?
    private String color;      // Какой цвет?
    private int speed;         // Текущая скорость
    
    // Конструктор
    public Car(String brand, String color) {
        this.brand = brand;
        this.color = color;
        this.speed = 0;
    }
    
    // Методы (поведение)
    public void accelerate(int amount) {
        speed += amount;
    }
    
    public void brake() {
        speed = 0;
    }
    
    public void displayInfo() {
        System.out.println(brand + " " + color + " (speed: " + speed + ")");
    }
}

Класс Car существует только в коде. Это абстрактная идея о том, как должна выглядеть машина и что она может делать.

Объект — это конкретный экземпляр

// Создание объектов (экземпляров класса Car)
Car car1 = new Car("BMW", "black");     // Объект 1
Car car2 = new Car("Mercedes", "white"); // Объект 2
Car car3 = new Car("Toyota", "red");    // Объект 3

// Разные объекты имеют разные значения
car1.accelerate(50);
car2.accelerate(100);
car3.accelerate(30);

car1.displayInfo();  // BMW black (speed: 50)
car2.displayInfo();  // Mercedes white (speed: 100)
car3.displayInfo();  // Toyota red (speed: 30)

Объекты существуют в памяти программы. Это реальные данные с конкретными значениями.

Визуальная аналогия

┌─────────────────────────────────────┐
│          КЛАСС (Шаблон)             │
├─────────────────────────────────────┤
│  Car                                │
│  - brand: String                    │
│  - color: String                    │
│  - speed: int                       │
│                                     │
│  + accelerate(int)                  │
│  + brake()                          │
│  + displayInfo()                    │
└─────────────────────────────────────┘
         (Существует только в коде)

           ↓ ↓ ↓

┌──────────────┐  ┌──────────────┐  ┌──────────────┐
│   ОБЪЕКТ 1   │  │   ОБЪЕКТ 2   │  │   ОБЪЕКТ 3   │
├──────────────┤  ├──────────────┤  ├──────────────┤
│ brand: BMW   │  │ brand: Merc  │  │ brand: Toy   │
│ color: black │  │ color: white │  │ color: red   │
│ speed: 50    │  │ speed: 100   │  │ speed: 30    │
└──────────────┘  └──────────────┘  └──────────────┘
  (Существуют в памяти)

Ключевые различия

АспектКлассОбъект
СущностьШаблон, тип данныхКонкретный экземпляр
СуществованиеКод, логический уровеньПамять, физический уровень
КоличествоОдин классМного объектов из одного класса
СозданиеОпределение классаИнстанцирование (new)
ДанныеОпределение структурыКонкретные значения
Время жизниВсё время выполнения программыОт создания до удаления
Размер в памятиНе занимает память (данные)Занимает память на Heap

Глубокий пример

public class Person {
    private String name;
    private int age;
    private String city;
    
    public Person(String name, int age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }
    
    public void introduce() {
        System.out.println("Hi, I'm " + name + ", " + age + " years old from " + city);
    }
}

// Класс Person — это инструкция
// Объекты — это конкретные люди

Person john = new Person("John", 25, "New York");
Person jane = new Person("Jane", 30, "Los Angeles");
Person bob = new Person("Bob", 22, "Chicago");

// Каждый объект имеет свои данные
john.introduce();  // Hi, I'm John, 25 years old from New York
jane.introduce();  // Hi, I'm Jane, 30 years old from Los Angeles
bob.introduce();   // Hi, I'm Bob, 22 years old from Chicago

Класс в памяти

// Класс — один раз в памяти (в Metaspace/PermGen)
class Car { ... }  // Загружается в Metaspace

// Объекты — каждый в Heap
Car car1 = new Car("BMW", "black");      // Heap: объект 1
Car car2 = new Car("Mercedes", "white"); // Heap: объект 2
┌─────────────────────────────────────┐
│        METASPACE/CLASS LOADER       │
├─────────────────────────────────────┤
│  Class Car:                         │
│  - Field brand                      │
│  - Field color                      │
│  - Field speed                      │
│  - Method accelerate()              │
│  - Method brake()                   │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│             HEAP                    │
├─────────────────────────────────────┤
│ Object 1 (id: 1)                    │
│  brand: "BMW"                       │
│  color: "black"                     │
│  speed: 0                           │
├─────────────────────────────────────┤
│ Object 2 (id: 2)                    │
│  brand: "Mercedes"                  │
│  color: "white"                     │
│  speed: 0                           │
└─────────────────────────────────────┘

Множественные объекты из одного класса

List<Car> cars = new ArrayList<>();

// Создаём 1000 объектов из одного класса
for (int i = 0; i < 1000; i++) {
    cars.add(new Car("Car" + i, "color" + i));
}

// Один класс Car, но 1000 разных объектов в памяти
System.out.println("Classes: 1 (Car)");    // Один класс
System.out.println("Objects: 1000");        // 1000 объектов

Сравнение с типом данных

// int — примитивный тип (как класс)
int x = 10;  // переменная x — это объект типа int (в Java, int — это примитив)
int y = 20;  // переменная y — другой "объект"

// Integer — оборачивающий класс (Box тип)
Integer a = 10;  // Класс Integer, объект a
Integer b = 20;  // Класс Integer, объект b

Практический пример: Dog и реальные собаки

// Класс Dog — это описание того, что такое собака
public class Dog {
    private String name;
    private String breed;
    private int age;
    
    public void bark() {
        System.out.println(name + " barks: Woof!");
    }
}

// Реальные объекты (реальные собаки)
Dog myDog = new Dog("Max", "Labrador", 3);      // Моя собака
Dog neighborDog = new Dog("Bella", "Poodle", 5); // Соседская собака
Dog strayDog = new Dog("Rex", "Mixed", 2);      // Бродячая собака

// Каждая собака уникальна, несмотря на то, что все они описаны классом Dog
myDog.bark();       // Max barks: Woof!
neighborDog.bark(); // Bella barks: Woof!
strayDog.bark();    // Rex barks: Woof!

Отношение "много к одному"

Класс Animal:     Объекты Animal:
┌────────────┐    
│  Animal    │    ┌─────────┬─────────┬─────────┬─────────┐
│ name       │───→│ Собака  │ Кошка   │ Птица   │ Рыба    │
│ age        │    └─────────┴─────────┴─────────┴─────────┘
│ eat()      │
└────────────┘

Один класс —> Множество объектов

Объект — это переменная, указывающая на класс

Car myCar;           // Переменная типа Car (не объект еще)
myCar = new Car();   // Теперь myCar — это объект класса Car

// Аналогия:
int x;      // Переменная типа int (не число еще)
x = 42;     // Теперь x содержит значение 42

Итог

Класс — это чертёж, инструкция, шаблон, определение типа. Это статическая сущность, существующая только в коде.

Объект — это конкретный экземпляр класса, созданный в памяти. Это динамическая сущность, имеющая конкретные значения и существующая в памяти Heap.

Од класса можно создать неограниченное количество объектов, каждый с собственными данными. Класс задаёт структуру и поведение, объект воплощает эту структуру в реальные данные.