JavaRush /Курсы /C# SELF /Классы и объекты: создание, конструкторы и инициализация

Классы и объекты: создание, конструкторы и инициализация

C# SELF
12 уровень , 0 лекция
Открыта

1. Создание объекта

Вот мы и дошли до созданий объектов. Вы уже сталкивались с этим ранее, просто сейчас мы разберем эту тему более подробно. На самом деле создавать объекты очень просто.

Чтобы создать объект, нужно использовать оператор new. Обычно вы создаёте новый экземпляр (объект) класса и тут же сохраняете его в переменную такого же типа.

Класс имя = new Класс(параметры);
Синтаксис создания объекта

Где Класс — тип объекта, имя — название переменной (часто с маленькой буквы, например cat), а справа от = — создание нового объекта этого класса.

Примеры:

Код Примечание
object o = new object();
Создание объекта типа object
Cat pet = new Cat();
Создание объекта типа Cat
var reader = new StreamReader("file.txt");
Создание объекта StreamReader с параметром

Очень часто программисты называют переменные таким же именем, что и классы, только с маленькой буквы. Программиста-новичка такой код может сбивать с толку:

Код
Student student = new Student();
Car car = new Car();
PersonInfo personInfo = new PersonInfo();

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

Слева — объявление переменной, справа — создание нового объекта в памяти с помощью new. Всё!

2. Конструктор

Вы, наверное, часто видели, что при создании объекта в него передаются какие-то параметры. Причем в некоторые объекты параметры передаются, а в некоторые — нет. Как вообще работает весь этот механизм с параметрами?

Тут тоже все просто: у каждого класса есть специальный метод (или методы), которые отвечают за обработку параметров при создании объекта. Такие методы называются конструкторы. А один метод, соответственно, конструктор.

Отличить метод-конструктор от обычного метода в коде несложно. Такой метод обладает двумя особенностями:

  • имя метода-конструктора совпадает с именем его класса (и начинается с большой буквы)
  • метод-конструктор не имеет типа возвращаемого результата (даже void не пишется).

Общий вид его обычно такой:


модификаторы Класс(параметры)
{
   код конструктора
}
Синтаксис конструктора

Пример объявления конструктора:

public class Point
{
    public int X;
    public int Y;

    public Point(int x, int y) // Конструктор
    {
        X = x;
        Y = y;
    }
}

Использование:

Point p = new Point(5, 10); // Вызов конструктора

При создании объекта через new Point(5, 10) будет вызван конструктор с двумя параметрами, которые инициализируют поля X и Y.

Иногда параметры конструктора имеют такие же имена, как и поля, — для удобства. Такой конфликт имён решается с помощью ключевого слова this:

public Point(int x, int y)
{
    this.x = x; // this.x — поле объекта, x — параметр конструктора
    this.y = y;
}

3. Вызов конструктора

Когда вы пишете new Класс(параметры), то C#:

  • создаёт новый объект в памяти,
  • вызывает подходящий конструктор, передавая ваши параметры.

Пример с классом кота:

public class Cat
{
    public string Name;
    public int Age;

    public Cat(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

Использование:

Cat cat = new Cat("Васька", 2); // Можно: вызовется конструктор с двумя параметрами
Cat cat2 = new Cat("Васька");   // Нельзя: такого конструктора нет — ошибка компиляции
Cat cat3 = new Cat();           // Нельзя: нет конструктора без параметров — ошибка компиляции

Если у класса есть только конструктор с параметрами, вы обязаны при создании объекта передать для них значения.

4. Несколько конструкторов

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

Пример:

public class Cat
{
    public const int UNKNOWN = -1;
    public string Name;
    public int Age;

    public Cat(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public Cat(string name)
    {
        Name = name;
        Age = UNKNOWN; // Значение "по умолчанию" для неизвестного возраста
    }
}

Использование:

Cat cat1 = new Cat("Васька", 2); // Использует первый конструктор
Cat cat2 = new Cat("Мурка");     // Использует второй конструктор
Cat cat3 = new Cat();            // Ошибка! Нет конструктора без параметров

Мы решили учесть ситуацию, что возраст кота может быть неизвестен. Для этого случая добавили в код специальную константу — UNKNOWN и конструктор, который принимает только один параметр — имя кота.

Обратите внимание, что мы по-прежнему инициализируем обе переменные класса внутри обоих конструкторов. Неизвестные/отсутствующие параметры мы заменяем на константу UNKNOWN.

5. Конструктор по умолчанию

Если у вашего класса нет ни одного конструктора, компилятор автоматически добавит пустой конструктор без параметров:


public ClassName()
{
}
Синтаксис конструктора по умолчанию

Но если в классе уже объявлен хотя бы один свой конструктор — автоматически пустой конструктор уже не добавляется.

Пример 1:

public class Cat
{
    public string Name;
    public int Age;
}

// Можно:
Cat cat = new Cat(); // Будет вызван конструктор по умолчанию (без параметров)

Пример 2:

public class Cat
{
    public string Name;
    public int Age;

    public Cat(string name) { Name = name; }
}

// Нельзя:
Cat cat = new Cat(); // Ошибка: конструктора без параметров больше нет!

6. Инициализация переменных

В C# переменные класса можно инициализировать либо прямо при объявлении, либо в конструкторе.

Пример:

public class Cat
{
    public string Name;
    public int Age = -1; // Стартовое значение

    public Cat(string name, int age)
    {
        Name = name;
        Age = age; // Перезаписывает стартовое значение
    }

    public Cat()
    {
        Name = "Безымянный";
        // Age остается -1 (стартовое значение)
    }
}

Пояснение:

  • При создании через new Cat("Васька", 2) переменная Age сначала будет -1, но затем конструктор присвоит ей 2.
  • При создании через new Cat()Age останется равной -1.

7. Порядок инициализации переменных

Данные нового объекта инициализируются в таком порядке:

  1. Поля класса сначала получают значения по умолчанию (0 для int, null для ссылочных типов и т. д.).
  2. Затем выполняются инициализаторы, которые вы указали при объявлении полей, в порядке их появления в коде.
  3. И только после этого выполняется код конструктора.

Переменные инициализируются до конструктора и в порядке объявления. Поэтому внимательно относитесь к зависимостям между полями.

Неверный пример

Нестатические поля нельзя инициализировать нестатическими переменными:


public class Solution
{
    public int a = 1; 
    public int b = a;        // нельзя использовать a
    public int c = a + b;   // нельзя использовать a и b
}
// Такой код вызовет ошибку компиляции!
Ошибка: нестатические поля не могут ссылаться друг на друга при инициализации

Правильный пример

Для статических переменных все будет работать:

public class Solution
{
    public static int a = 1;          // Явно задаём a = 1
    public static int b = a + 2;      // b = 1 + 2 ⇒ 3
    public static int c = a + b + 3;  // c = 1 + 3 + 3 ⇒ 7

    public Solution()
    {
        Console.WriteLine($"a = {a}, b = {b}, c = {c}");
        // Выведет: a = 1, b = 3, c = 7 — именно то, что ожидается
    }
}
Инициализация статических полей

Правильный пример 2

Для статических полей можно даже написать так:

public class Solution
{
    public static int a = b + c + 1;    // b и c еще равны 0
    public static int b = a + c + 2;    // a == 1, c еще равно 0
    public static int c = a + b + 3;    // a == 1, b == 3
}
Статические поля и порядок их инициализации
2
Задача
C# SELF, 12 уровень, 0 лекция
Недоступна
Создание класса и объекта
Создание класса и объекта
2
Задача
C# SELF, 12 уровень, 0 лекция
Недоступна
Инициализация переменных и несколько конструкторов
Инициализация переменных и несколько конструкторов
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Александр Уровень 33
26 октября 2025
изи пизи лемон сквизи