Основы OOP: класс, объект, экземпляр, атрибуты и методы
Статья представляет собой определение ключевых терминов в области объектно-ориентированного программирования – включая классы, объекты, атрибуты и методы.
Коротко о главном
OOP – это парадигма программирования, которая строит программное обеспечение из переиспользуемых, четко структурированных “кирпичей” – объектов. Класс служит чертежом, объект же является конкретным воплощением этого чертежа.
Краткое техническое описание
Объектно-ориентированное программирование (OOP) – это парадигма, которая моделирует реальные объекты с помощью программных объектов. Фундаментальное различие между классом и объектом таково:
Класс (чертеж):
- Абстрактный шаблон или образец
- Определяет атрибуты (свойства) и методы (способности)
- Существует в коде в единственном экземпляре
- Пример: класс
Autoопределяет свойства вроде цвета и методы вродеbremsen()
Объект/экземпляр (конкретная вещь):
- Конкретное воплощение класса
- Создается во время выполнения программы (оператор
new) - Имеет специфичные значения атрибутов
- Пример: объект
meinGolfс цветом=“синий”, мощностью=150л.с.
Ключевые принципы:
- Инкапсуляция: данные и методы объединяются в единое целое
- Переиспользуемость: класс можно многократно инстанцировать
- Структурирование: четкое разделение ответственности
- Абстракция: сложная реальность сводится к релевантным свойствам
Важные моменты для понимания
- Класс vs объект: абстрактный чертеж vs конкретный экземпляр
- Атрибуты: свойства и данные объекта
- Методы: поведение и способности объекта
- Инстанцирование: создание объектов на основе класса
- Конструктор: специальный метод для создания объектов
- Инкапсуляция: объединение данных и методов
- На практике: переиспользуемость и удобство обслуживания кода
- В разработке: фундаментальное понимание для построения ПО
Основные компоненты
- Класс: определение с атрибутами и методами
- Объект: конкретный экземпляр класса
- Атрибуты: свойства и данные объекта
- Методы: поведение и функции объекта
- Конструктор: метод инициализации для новых объектов
- Переменные экземпляра: данные, специфичные для объекта
- Методы класса: методы, работающие с самим классом
- 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
- Переиспользуемость: классы можно применять в разных проектах
- Поддерживаемость: чёткая структура облегчает внесение изменений
- Понятность: кодовая база отражает реальный мир
- Инкапсуляция: данные защищены и доступны только по необходимости
- Масштабируемость: большие системы организуются структурированно
Недостатки
- Дополнительные затраты: требуется больше кода для простых задач
- Кривая обучения: объектно-ориентированное мышление требует практики
- Производительность: создание объектов может быть затратным
- Сложность: большое количество классов делает систему запутанной
Частые вопросы на экзаменах
-
В чём различие между классом и объектом? Класс это схема конструкции, объект это конкретный экземпляр во время выполнения программы.
-
Объясните понятия атрибута и метода! Атрибуты это свойства и данные, методы это поведение и функции объекта.
-
Что такое конструктор? Специальный метод для инициализации новых объектов, вызывается при new.
-
Почему инкапсуляция важна? Она защищает данные от неконтролируемого доступа и позволяет валидировать значения.
Основные источники
- https://de.wikipedia.org/wiki/Objektorientierte_Programmierung
- https://docs.oracle.com/javase/tutorial/java/concepts/
- https://docs.python.org/3/tutorial/classes.html
Продолжим путь обучения OOP
Следующая статья в этом цикле посвящена OOP концепциям: атрибуты, сообщения, вызовы методов, персистентность и интерфейсы — объясняем ключевые идеи объектно-ориентированного программирования.
Рекомендуемая литература: Объектно-ориентированное программирование
Keine Bücher für Kategorie "objektorientierte-programmierung" gefunden.



