Skip to content
IRC-CodingIRC-Coding
OOP основыКласс объектАтрибуты методыЭкземплярКонструктор

OOP основы: класс, объект, атрибуты и методы

Изучите OOP: класс как чертёж, объект как экземпляр. Атрибуты, методы, конструкторы и связь между абстракцией и реализацией.

S

schutzgeist

6 min read
OOP основы: класс, объект, атрибуты и методы

Основы OOP: класс, объект, экземпляр, атрибуты и методы

Статья представляет собой определение ключевых терминов в области объектно-ориентированного программирования – включая классы, объекты, атрибуты и методы.

Коротко о главном

OOP – это парадигма программирования, которая строит программное обеспечение из переиспользуемых, четко структурированных “кирпичей” – объектов. Класс служит чертежом, объект же является конкретным воплощением этого чертежа.

Краткое техническое описание

Объектно-ориентированное программирование (OOP) – это парадигма, которая моделирует реальные объекты с помощью программных объектов. Фундаментальное различие между классом и объектом таково:

Класс (чертеж):

  • Абстрактный шаблон или образец
  • Определяет атрибуты (свойства) и методы (способности)
  • Существует в коде в единственном экземпляре
  • Пример: класс Auto определяет свойства вроде цвета и методы вроде bremsen()

Объект/экземпляр (конкретная вещь):

  • Конкретное воплощение класса
  • Создается во время выполнения программы (оператор new)
  • Имеет специфичные значения атрибутов
  • Пример: объект meinGolf с цветом=“синий”, мощностью=150л.с.

Ключевые принципы:

  • Инкапсуляция: данные и методы объединяются в единое целое
  • Переиспользуемость: класс можно многократно инстанцировать
  • Структурирование: четкое разделение ответственности
  • Абстракция: сложная реальность сводится к релевантным свойствам

Важные моменты для понимания

  • Класс vs объект: абстрактный чертеж vs конкретный экземпляр
  • Атрибуты: свойства и данные объекта
  • Методы: поведение и способности объекта
  • Инстанцирование: создание объектов на основе класса
  • Конструктор: специальный метод для создания объектов
  • Инкапсуляция: объединение данных и методов
  • На практике: переиспользуемость и удобство обслуживания кода
  • В разработке: фундаментальное понимание для построения ПО

Основные компоненты

  1. Класс: определение с атрибутами и методами
  2. Объект: конкретный экземпляр класса
  3. Атрибуты: свойства и данные объекта
  4. Методы: поведение и функции объекта
  5. Конструктор: метод инициализации для новых объектов
  6. Переменные экземпляра: данные, специфичные для объекта
  7. Методы класса: методы, работающие с самим классом
  8. Getter/Setter: методы доступа к атрибутам

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

1. Простой класс на Java

// Класс как чертеж
public class Auto {
    // Атрибуты (свойства)
    private String farbe;
    private int anzahlTueren;
    private int leistungInPS;
    private int aktuelleGeschwindigkeit;
    
    // Конструктор для создания объектов
    public Auto(String farbe, int anzahlTueren, int leistungInPS) {
        this.farbe = farbe;
        this.anzahlTueren = anzahlTueren;
        this.leistungInPS = leistungInPS;
        this.aktuelleGeschwindigkeit = 0;
    }
    
    // Методы (поведение)
    public void beschleunigen(int kmh) {
        this.aktuelleGeschwindigkeit += kmh;
        System.out.println("Auto beschleunigt auf " + this.aktuelleGeschwindigkeit + " km/h");
    }
    
    public void bremsen(int kmh) {
        if (this.aktuelleGeschwindigkeit >= kmh) {
            this.aktuelleGeschwindigkeit -= kmh;
            System.out.println("Auto bremst auf " + this.aktuelleGeschwindigkeit + " km/h");
        } else {
            System.out.println("Kann nicht unter 0 km/h bremsen");
        }
    }
    
    // Getter-методы для доступа к атрибутам
    public String getFarbe() {
        return farbe;
    }
    
    public int getAktuelleGeschwindigkeit() {
        return aktuelleGeschwindigkeit;
    }
    
    public void anzeigen() {
        System.out.println("Auto - Farbe: " + farbe + 
                          ", Türen: " + anzahlTueren + 
                          ", Leistung: " + leistungInPS + " PS" +
                          ", Geschwindigkeit: " + aktuelleGeschwindigkeit + " km/h");
    }
}

// Использование класса
public class Garage {
    public static void main(String[] args) {
        // Создание объектов (экземпляров)
        Auto meinGolf = new Auto("blau", 5, 150);
        Auto deinA3 = new Auto("schwarz", 3, 120);
        Auto companyAuto = new Auto("silber", 4, 200);
        
        // Использование объектов
        meinGolf.anzeigen();
        meinGolf.beschleunigen(50);
        meinGolf.beschleunigen(30);
        meinGolf.bremsen(20);
        
        System.out.println("---");
        
        deinA3.anzeigen();
        deinA3.beschleunigen(80);
        
        System.out.println("---");
        
        companyAuto.anzeigen();
        companyAuto.beschleunigen(100);
    }
}

2. Класс на Python

# Класс как чертеж
class Auto:
    # Атрибут класса (общий для всех машин)
    anzahl_autos = 0
    
    # Конструктор
    def __init__(self, farbe, anzahl_tueren, leistung_in_ps):
        # Атрибуты экземпляра (специфичны для объекта)
        self.farbe = farbe
        self.anzahl_tueren = anzahl_tueren
        self.leistung_in_ps = leistung_in_ps
        self.aktuelle_geschwindigkeit = 0
        
        # Увеличиваем счетчик машин
        Auto.anzahl_autos += 1
    
    # Методы
    def beschleunigen(self, kmh):
        self.aktuelle_geschwindigkeit += kmh
        print(f"Auto beschleunigt auf {self.aktuelle_geschwindigkeit} km/h")
    
    def bremsen(self, kmh):
        if self.aktuelle_geschwindigkeit >= kmh:
            self.aktuelle_geschwindigkeit -= kmh
            print(f"Auto bremst auf {self.aktuelle_geschwindigkeit} km/h")
        else:
            print("Kann nicht unter 0 km/h bremsen")
    
    def anzeigen(self):
        print(f"Auto - Farbe: {self.farbe}, Türen: {self.anzahl_tueren}, " +
              f"Leistung: {self.leistung_in_ps} PS, " +
              f"Geschwindigkeit: {self.aktuelle_geschwindigkeit} km/h")
    
    # Метод класса
    @classmethod
    def get_anzahl_autos(cls):
        return cls.anzahl_autos

# Использование класса
def garage_demo():
    # Создание объектов (экземпляров)
    mein_golf = Auto("blau", 5, 150)
    dein_a3 = Auto("schwarz", 3, 120)
    company_auto = Auto("silber", 4, 200)
    
    # Использование объектов
    mein_golf.anzeigen()
    mein_golf.beschleunigen(50)
    mein_golf.beschleunigen(30)
    mein_golf.bremsen(20)
    
    print("---")
    
    dein_a3.anzeigen()
    dein_a3.beschleunigen(80)
    
    print("---")
    
    company_auto.anzeigen()
    company_auto.beschleunigen(100)
    
    print(f"Anzahl erstellter Autos: {Auto.get_anzahl_autos()}")

if __name__ == "__main__":
    garage_demo()

3. Класс на C#

using System;

// Класс как чертеж
public class Auto
{
    // Атрибуты (свойства)
    private string farbe;
    private int anzahlTueren;
    private int leistungInPS;
    private int aktuelleGeschwindigkeit;
    
    // Статическое свойство для всех машин
    public static int AnzahlAutos { get; private set; }
    
    // Конструктор
    public Auto(string farbe, int anzahlTueren, int leistungInPS)
    {
        this.farbe = farbe;
        this.anzahlTueren = anzahlTueren;
        this.leistungInPS = leistungInPS;
        this.aktuelleGeschwindigkeit = 0;
        AnzahlAutos++;
    }
    
    // Методы
    public void Beschleunigen(int kmh)
    {
        this.aktuelleGeschwindigkeit += kmh;
        Console.WriteLine($"Auto beschleunigt auf {this.aktuelleGeschwindigkeit} km/h");
    }
    
    public void Bremsen(int kmh)
    {
        if (this.aktuelleGeschwindigkeit >= kmh)
        {
            this.aktuelleGeschwindigkeit -= kmh;
            Console.WriteLine($"Auto bremst auf {this.aktuelleGeschwindigkeit} km/h");
        }
        else
        {
            Console.WriteLine("Kann nicht unter 0 km/h bremsen");
        }
    }
    
    // Properties для доступа к атрибутам
    public string Farbe => farbe;
    public int AktuelleGeschwindigkeit => aktuelleGeschwindigkeit;
    
    public void Anzeigen()
    {
        Console.WriteLine($"Auto - Farbe: {farbe}, Türen: {anzahlTueren}, " +
                         $"Leistung: {leistungInPS} PS, " +
                         $"Geschwindigkeit: {aktuelleGeschwindigkeit} km/h");
    }
}

// Использование класса
public class Garage
{
    public static void Main(string[] args)
    {
        // Создание объектов (экземпляров)
        Auto meinGolf = new Auto("blau", 5, 150);
        Auto deinA3 = new Auto("schwarz", 3, 120);
        Auto companyAuto = new Auto("silber", 4, 200);
        
        // Использование объектов
        meinGolf.Anzeigen();
        meinGolf.Beschleunigen(50);
        meinGolf.Beschleunigen(30);
        meinGolf.Bremsen(20);
        
        Console.WriteLine("---");
        
        deinA3.Anzeigen();
        deinA3.Beschleunigen(80);
        
        Console.WriteLine("---");
        
        companyAuto.Anzeigen();
        companyAuto.Beschleunigen(100);
        
        Console.WriteLine($"Anzahl erstellter Autos: {Auto.AnzahlAutos}");
    }
}

Концепции в деталях

Конструкторы

// Перегруженные конструкторы в Java
public class Auto {
    private String farbe;
    private int leistung;
    
    // Конструктор по умолчанию
    public Auto() {
        this.farbe = "schwarz";
        this.leistung = 100;
    }
    
    // Конструктор с параметрами
    public Auto(String farbe, int leistung) {
        this.farbe = farbe;
        this.leistung = leistung;
    }
    
    // Копирующий конструктор
    public Auto(Auto other) {
        this.farbe = other.farbe;
        this.leistung = other.leistung;
    }
}

Статические члены и члены экземпляра

public class MathUtil {
    // Статический метод - принадлежит классу
    public static int addiere(int a, int b) {
        return a + b;
    }
    
    // Метод экземпляра - принадлежит объекту
    private int wert;
    
    public MathUtil(int startWert) {
        this.wert = startWert;
    }
    
    public int addiereZuWert(int a) {
        this.wert += a;
        return this.wert;
    }
}

// Использование
int ergebnis1 = MathUtil.addiere(5, 3);  // Статически
MathUtil rechner = new MathUtil(10);
int ergebnis2 = rechner.addiereZuWert(5);  // Экземпляр

Getters и Setters

public class Person {
    private String name;
    private int alter;
    
    // Getter
    public String getName() {
        return name;
    }
    
    // Setter с валидацией
    public void setAlter(int alter) {
        if (alter >= 0 && alter <= 150) {
            this.alter = alter;
        } else {
            throw new IllegalArgumentException("Ungültiges Alter");
        }
    }
    
    // Getter для вычисляемого значения
    public boolean istVolljaehrig() {
        return alter >= 18;
    }
}

Преимущества и недостатки

Преимущества OOP

  • Переиспользуемость: классы можно применять в разных проектах
  • Поддерживаемость: чёткая структура облегчает внесение изменений
  • Понятность: кодовая база отражает реальный мир
  • Инкапсуляция: данные защищены и доступны только по необходимости
  • Масштабируемость: большие системы организуются структурированно

Недостатки

  • Дополнительные затраты: требуется больше кода для простых задач
  • Кривая обучения: объектно-ориентированное мышление требует практики
  • Производительность: создание объектов может быть затратным
  • Сложность: большое количество классов делает систему запутанной

Частые вопросы на экзаменах

  1. В чём различие между классом и объектом? Класс это схема конструкции, объект это конкретный экземпляр во время выполнения программы.

  2. Объясните понятия атрибута и метода! Атрибуты это свойства и данные, методы это поведение и функции объекта.

  3. Что такое конструктор? Специальный метод для инициализации новых объектов, вызывается при new.

  4. Почему инкапсуляция важна? Она защищает данные от неконтролируемого доступа и позволяет валидировать значения.

Основные источники

  1. https://de.wikipedia.org/wiki/Objektorientierte_Programmierung
  2. https://docs.oracle.com/javase/tutorial/java/concepts/
  3. https://docs.python.org/3/tutorial/classes.html

Продолжим путь обучения OOP

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

Рекомендуемая литература: Объектно-ориентированное программирование

Keine Bücher für Kategorie "objektorientierte-programmierung" gefunden.

Назад к блогу
Share:

Nächster Artikel in Разработка программного обеспечения

Weiterlesen
ООП Полиморфизм: основы, динамическая привязка

Похожие статьи