Что такое объект в объектно-ориентированном программировании?

«Что такое объект в объектно-ориентированном программировании?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  1. Состояние (State): Данные, описывающие объект. Хранятся в полях (fields) или атрибутах (attributes).
  2. Поведение (Behavior): Действия, которые объект может выполнять. Определяются методами (methods) — функциями, привязанными к объекту.
  3. Идентичность (Identity): Уникальный адрес в памяти, который отличает один объект от другого, даже если их состояние идентично (в Python это id(object)).

Жизненный цикл объекта:

  1. Создание (Instantiation): Вызов конструктора класса (__init__ в Python, new в Java/C#).

    # Класс — это чертеж
    class Car:
        def __init__(self, model, year):
            self.model = model  # Атрибут состояния
            self.year = year
            self.mileage = 0    # Атрибут с начальным значением
    
        # Метод поведения
        def drive(self, km):
            self.mileage += km
            print(f"Проехали {km} км. Общий пробег: {self.mileage} км.")
    
    # Создание объектов — экземпляров класса Car
    my_car = Car("Tesla Model 3", 2023)  # my_car — это объект
    friends_car = Car("Toyota Camry", 2020) # friends_car — другой объект
  2. Использование: Взаимодействие с объектом через вызов его методов и доступ к атрибутам (с учетом инкапсуляции).

    print(my_car.model)   # Tesla Model 3 (состояние)
    print(friends_car.year) # 2020
    my_car.drive(150)     # Проехали 150 км... (поведение)
    friends_car.drive(50) # Проехали 50 км...
  3. Уничтожение (Garbage Collection): Когда на объект больше нет ссылок, сборщик мусора освобождает занимаемую им память (в языках с автоматическим управлением памятью, таких как Python, Java, C#).

Ключевые характеристики объектов:

  • Инкапсуляция: Внутреннее состояние объекта (mileage) часто защищено от прямого внешнего изменения. Изменять его следует через публичные методы (drive()).
  • Независимость: Каждый объект существует независимо. Изменение my_car.mileage не влияет на friends_car.mileage.
  • Взаимодействие: Объекты общаются друг с другом, отправляя сообщения (вызывая методы друг друга).

    class Garage:
        def service(self, car): # Принимает объект Car в качестве аргумента
            print(f"Обслуживаем автомобиль {car.model}")
            car.mileage += 1 # Моделируем пробег до сервиса
    
    my_garage = Garage()
    my_garage.service(my_car) # Объект my_car взаимодействует с объектом my_garage

Аналогия из реального мира: Класс Car — это инженерный чертеж. Объекты my_car и friends_car — это конкретные автомобили, собранные по этому чертежу. У каждого свой VIN-номер (идентичность), текущая скорость и уровень топлива (состояние), и они могут завестись или остановиться (поведение).