Конструктор класса это метод который вызывается при создании экземпляра класса с целью

Обновлено: 04.05.2024

Классы Java являются одними из основных строительных блоков приложений Java, наборов инструментов, платформ, API и т. д. Небольшое приложение может состоять из одного класса с методом main(). По мере роста программы хранение всего кода в одном классе усложняет его обзор. Поэтому может быть полезно начать разбивать код на несколько классов.

Класс – это единая, согласованная единица кода, которая принадлежит друг другу. Может содержать смесь данных (переменных) и действий (методов). Группировка переменных и операций над этими переменными в классы упрощает структурирование вашей программы, когда она становится слишком большой для одного класса.

Должен храниться в своем собственном файле. Следовательно, с ростом класса файл, который вы редактируете, также увеличивается, и становится все труднее держать его в голове.

Ваше приложение обычно должно содержать хотя бы один класс, но оно может содержать их столько, на сколько считаете целесообразным разделить ваше приложение. Java также поставляется с большим количеством предопределенных классов, так что вам не нужно кодировать каждую маленькую функцию.

Класс может содержать следующие строительные блоки:

  • поля – это переменные (данные), которые являются локальными для класса, или экземпляры (объекты) этого класса;
  • конструкторы – это методы, которые инициализируют экземпляр класса. Часто устанавливают значения полей в данном экземпляре;
  • методы – это операции, которые класс или экземпляры могут выполнять. Например, метод может выполнить операцию над входными параметрами или изменить значение полей, хранящихся внутри объекта и т. д. ;
  • вложенные классы – это классы, которые определены внутри другого класса.

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

Не все классы имеют поля, конструкторы и методы. Иногда содержат только поля (данные), а иногда – методы (операции). Все зависит от того, что он должен делать.

Определение класса Java

Это определяет общедоступный класс под названием MyClass. Не имеет полей, конструкторов или методов.

Файлы .java

Приведенное выше определение следует поместить в его собственный файл с именем MyClass.java. Файлы должны называться так же, как и имя класса, который они содержат, с расширением .java в качестве расширения имени файла.

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

Класс с полями

Класс может содержать данные в форме переменных, их обычно называют «полями».

В следующем примере показан класс, предназначенный для моделирования автомобиля. Поэтому назван Car и имеет три поля:

У класса Car нет методов. Только полевые объявления.

С конструктором

Класс может иметь конструктор – это специальный метод, который вызывается при создании объекта. Целью его является инициализация полей. Поля также называются «внутренним состоянием». Вот пример двумя конструкторами:

Конструкторы – это два метода, имя которых совпадает с именем класса, и для которых не указан тип возвращаемого значения. Первый не принимает параметров, а второй принимает 3 параметра. Второй сохраняет значения этих параметров в полях созданного объекта.

С методами

Класс также может содержать операции, обычно называемые методами. Метод содержит инструкции Java, которые обычно выполняют некоторые операции над полем в классе или над одним из значений параметров (также переменных), передаваемых методу при вызове метода.

Вот пример Car из предыдущего раздела с добавленным методом:

В приведенном выше определении класса добавлен метод setColor(). При вызове этот метод устанавливает внутреннюю переменную цвета (поле) в новое значение.

С вложенным классом

Как упоминалось ранее, вы можете определить вложенный класс внутри другого:

В приведенном выше примере внешний класс называется MyClass, а вложенный – MyNestedClass. Ни один из классов не имеет полей или методов, но как внешний, так и вложенный класс могут иметь столько полей и методов, сколько вы считаете нужным.

Объекты

Класс – это шаблон того, как выглядят объекты этого класса. Другими словами, класс Car в предыдущем разделе – это шаблон того, как выглядят объекты Car.

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

В этом примере создаются 3 переменные Car, и каждой присваивается новый экземпляр класса Car. Каждая из них теперь ссылается на объект Car, но на отдельный объект, также называемый экземпляром. Если вы измените поля одного объекта, поля других объектов не изменятся. Таким образом, поля разных объектов (даже одного и того же класса) могут различаться независимо друг от друга.

После создания 3 объектов Car метод setColor() вызывается для каждого объекта. Теперь цвет (представленный в виде текста) устанавливается индивидуально для каждого объекта Car.

Создание объекта определенного класса также называется «создание экземпляра» объекта. Таким образом, объект также называется «экземпляром» данного класса. Например, каждый из вышеперечисленных объектов Car также называется экземпляром класса Car или просто «экземплярами Car».

В объектно-ориентированном программировании конструктор класса (от англ. constructor , иногда сокращают ctor) — специальный блок инструкций, вызываемый при создании объекта, причём или при его объявлении (располагаясь в стеке или в статической памяти, что допустимо в C++, но не в куче при использовании ключевого слова new .

Конструктор схож с методом, но отличается от метода тем, что не имеет явным образом определённого типа возвращаемых данных, не наследуется, и обычно имеет различные правила для рассматриваемых модификаторов. Конструкторы часто выделяются наличием одинакового имени с именем класса, в котором объявляется. Их задача — инициализировать члены объекта и определить инвариант класса, сообщив в случае некорректности инварианта. Корректно написанный конструктор оставит объект в 'правильном' статусе. Неизменяемые объекты тоже должны быть проинициализированы конструктором.

Термин конструктор также используется для обозначения одного из тегов, описывающих данные в алгебраическом типе данных. Это использование несколько отличается от описываемого в статье. Для дополнительной информации смотрите Алгебраический тип данных.

В большинстве языков конструктор может быть перегружен, что позволяет использовать несколько конструкторов в одном классе, причём каждый конструктор может иметь различные параметры. Некоторые языки различают несколько особых типов конструкторов:

    — конструктор, не принимающий аргументов. — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него).
  • Конструктор преобразования — конструктор, принимающий один аргумент. Эти конструкторы могут вызываться автоматически для преобразования значений других типов в объекты данного класса.

Содержание

Виды конструкторов

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

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

Конструктор копирования

Конструктор, аргументом которого является ссылка на объект того же класса. Применяется в C++ для передачи объектов в функции по значению.

Конструктор копирования нужен, например, если для хранения данных объекта требуется дополнительно выделяемая память. Если его не будет, то конструктором копирования (сгенерированным компилятором) будут скопированы указатели, адресующие данные прежнего объекта (без выделения новой памяти). Соответственно попытка изменения «копии» повредит оригинал, а вызов деструктора для одного из этих объектов при последующем использовании другого приведёт к обращению в область памяти, уже не принадлежащую программе.

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

Конструктор преобразования

Конструктор, принимающий один агрумент. Задаёт преобразование типа своего аргумента в тип конструктора. Такое преобразование типа неявно применяется только если оно уникально.

Виртуальный конструктор

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

  • Этот класс является потомком некоего наперёд заданного класса (в данном примере это класс TVehicle )
  • На всём пути наследования от базового класса к создаваемому цепочка переопределения не обрывалась (при переопределении виртуального метода синтаксис Delphi требует ключевое слово override для переопределения функции либо reintroduce для задания новой функции с тем же именем).

В языке вводится так называемый классовый тип. Этот тип в качестве значения может принимать название любого класса, производного от TVehicle .

Такой механизм позволяет создавать объекты любого заранее неизвестного класса, производного от TVehicle .

Заметьте, что код

является некорректным — директива reintroduce разорвала цепочку переопределения виртуального метода, и в действительности будет вызван конструктор TMotorcycle.Create (а значит, будет создан мотоцикл, а не мопед!)

Синтаксис

Имя конструктора должно совпадать с именем класса. Допускается использовать несколько конструкторов с одинаковым именем, но различными параметрами.

Python

В языке Python конструктором является метод класса с именем __init__ . Кроме того не следует забывать, что первым аргументом любого метода должен быть указатель на контекст класса self.

Пример

Delphi

В C++, для объявления конструктора служит ключевое слово constructor . Имя конструктора может быть любым, но рекомендуется называть конструктор Create .

Пример

  • Конструкторы не имеют чётко определённого типа возвращаемых данных.
  • Конструкторы не могут напрямую вызываться (необходимо использовать ключевое слово new ).
  • Конструкторы не могут быть synchronized, final, abstract, native и static типов.
  • Конструкторы всегда выполняются в том же потоке.

Пример

Конструкторы в Visual Basic используют обычный метод объявления с именем New .

Пример

Пример

Eiffel

В Эйфеле подпрограммы, которые инициализируют объекты, называются процедурами создания. Процедуры создания в чём-то подобны конструкторам и в чём-то отличаются. Они имеют следующие характеристики:

  • Процедуры создания не имеют никакого явного типа результата возврата (по определению процедуры[Примечание 1] ).
  • Процедуры создания поименованы. Имена ограничены допустимыми идентификаторами.
  • Процедуры создания задаются по именам в тексте класса.
  • Процедуры создания могут быть вызваны напрямую (как обычные процедуры) для повторной инициализации объектов.
  • Каждый эффективный (т.е. конкретный, не абстрактный) класс должен (явно или неявно) указать по крайней мере одну процедуру создания.
  • Процедуры создания отвечают за приведение только что проинициализированного объекта в состояние, которое удовлетворяет инварианту класса [Примечание 2] .

Хотя создание объекта является предметом некоторых тонкостей [Примечание 3] , создание аттрибута с типовым объявлением x: T , выраженном в виде инструкции создания create x.make состоит из следующей последовательности шагов:

  • Создать новый непосредственный экземпляр типа T [Примечание 4] .
  • Выполнить процедуру создания make для вновь созданного экземпляра.
  • Прикрепить вновь созданный объект к сущности x .

Пример

В первом отрывке ниже определяется класс POINT . Процедура make кодируется после ключевого слова feature .

Ключевое слово create вводит список процедур, которые могут быть использованы для инициализации экземпляров класса. В данном случае список содержит default_create , процедуру с пустой реализацией, унаследованной из класса ANY , и процедуру make с реализацией в самом классе POINT .

Во втором отрывке класс, являющийся клиентом класса POINT , имеет объявления my_point_1 и my_point_2 типа POINT .

В коде подпрограммы my_point_1 создаётся с координатами (0.0; 0.0). Поскольку в инструкции создания не указана процедура создания, используется процедура default_create , унаследованная из класса ANY . Эта же строка могла бы быть переписана как create my_point_1.default_create . Только процедуры, указанные как процедуры создания могут использоваться в инструкциях создания (т.е. в инструкциях с ключевым словом create ).

Следующей идёт инструкция создания для my_point_2 , задающая начальные значения для координат my_point_2 .

Третья инструкция осуществляет обычный вызов процедуры make для ре-инициализации экземпляра, прикреплянного к my_point_2 , другими значениями.

Пример

Необходимо отметить, что в ColdFusion не существует метода-конструктора. Широкое распространение среди сообщества программистов на ColdFusion получил способ вызова метода ' init ', выступающего в качестве псевдоконструктора.

Пример

В PHP (начиная с версии 5) конструктор — это метод __construct() , который автоматически вызывается ключевым словом new после создания объекта. Обычно используется для выполнения различных автоматических инициализаций, как например, инициализация свойств. Конструкторы также могут принимать аргументы, в этом случае, когда указано выражение new , необходимо передать конструктору формальные параметры в круглых скобках.

Тем не менее, конструктор в PHP версии 4 (и ранее) — метод класса с именем этого же класса.

Упрощенные конструкторы (с псевдокодом)

Конструкторы всегда являются частью реализации классов. Класс (в программировании) описывает спецификации основных характеристик набора объектов, являющихся членами класса, а не отдельные характеристики какого-либо объекта из них. Рассмотрим простую аналогию. Возьмем в качестве примера набор (или класс, используя его более общее значение) учеников некоторой школы. Таким образом мы имеем:

Тем не менее, класс Student — всего лишь общий шаблон (прототип) наших школьников. Для его использования программист создает каждого школьника в виде объекта или сущности (реализации) класса. Этот объект является тем реальным фрагментом данных в памяти, чьи размер, шаблон, характеристики и (в некоторой мере) поведение определяются описанием класса. Обычный способ создания объектов — вызов конструктора (классы в общем случае могут иметь отдельные конструкторы). Например,

Примечания

  1. ↑Подпрограммы Эйфеля являются либо процедурами либо функциями. У процедур нет никакого возвращаемого типа. Функции всегда имеют возвращаемый тип.
  2. ↑ Поскольку должен быть также удовлетворён инвариант наследуемого(-ых) класса(-ов), нет обязательного требования вызова родительских конструкторов.
  3. ↑ Полная спецификация содержится в стандартах ISO/ECMA по языку программироная Эйфель в он-лайн доступе. [1]
  4. ↑ Стандарт Эйфеля требует, чтобы поля были инициализированы при первом доступе к ним, т.ч. нет необходимости осуществлять их инициализацию значениями по умолчанию во время создания объекта.

Ссылки

См. также

Wikimedia Foundation . 2010 .

Полезное

Смотреть что такое "Конструктор класса" в других словарях:

конструктор класса — Специальный блок инструкций, вызываемый при создании объекта. [ГОСТ Р 54456 2011] Тематики телевидение, радиовещание, видео EN class constructor … Справочник технического переводчика

Конструктор (программирование) — У этого термина существуют и другие значения, см. Конструктор. В объектно ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) специальный блок инструкций, вызываемый при создании объекта.… … Википедия

Конструктор объекта — В объектно ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) специальный блок инструкций, вызываемый при создании объекта, причём или при его объявлении (располагаясь в стеке или в статической… … Википедия

Конструктор по умолчанию — (англ. default constructor), в объектно ориентированных языках программирования конструктор, который может быть вызван без аргументов. В C++ и Java если нет явным образом опредёленных конструкторов в классе, то компилятор использует… … Википедия

конструктор по умолчанию — Конструктор, создаваемый компилятором при отсутствии конструктора класса. [ГОСТ Р 54456 2011] Тематики телевидение, радиовещание, видео EN default constructor … Справочник технического переводчика

Конструктор копирования — Конструктором копирования (в англоязычной литературе используется термин copy constructor) называется специальный конструктор в языке программирования C++, применяемый для создания нового объекта как копии уже существующего. Такой конструктор… … Википедия

Поле класса — или атрибут (переменная член, data member, class field, instance variable) в объектно ориентированном программировании переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по… … Википедия

АПЛ Класса "Борей" — РПКСН проекта 955 «Борей» схема проекта Основные характеристики Тип корабля РПКСН … Википедия

Деструктор класса — Деструктор специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Содержание 1 Деструктор в Delphi 2 Деструктор в С++ 3 Виртуальный деструктор … Википедия

Подводные лодки класса «Декабрист» — Многоцелевая ПЛ «Декабрист» серия I музей Д 2 «Народоволец» Основные характеристики Тип корабля Большая торпедная подводная лодка … Википедия

Java-конструктор – это специальный метод, который вызывается при создании экземпляра объекта. Другими словами, когда вы используете новое ключевое слово. Цель конструктора – инициализировать вновь созданный объект перед его использованием.

Вот простой пример:

Здесь создается новый объект MyClass и вызывается конструктор без аргументов MyClass.

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

Объявление конструктора Java

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

Конструктор – это часть:

  • Первая часть объявления конструктора – это модификатор доступа. Он имеет те же значения, что и для методов и полей. Определяют, какие классы могут получить доступ (вызвать) конструктор.
  • Вторая часть – это имя класса, к которому принадлежит конструктор. Использование сигнализирует компилятору, что это конструктор. Также обратите внимание, что конструктор не имеет возвращаемого типа, как другие методы Java.
  • Третья часть – это список параметров, которые может принимать конструктор. Объявляются в круглых скобках () после части имени класса конструктора. В приведенном выше примере параметры не объявляются.
  • Четвертая часть – это тело конструктора. Определяется внутри фигурных скобок <> после списка параметров. В приведенном выше примере нет операций внутри тела конструктора. Говорят, что это «пустой» конструктор.

Перегрузка конструктора

Класс может иметь несколько конструкторов, если их сигнатура (параметры, которые они принимают) не совпадают. Когда класс содержит несколько конструкторов, мы говорим, что конструктор перегружен (поставляется в нескольких версиях):

Класс выше содержит два конструктора. Первый – без аргументов, то есть он не принимает параметров. Второй – принимает параметр int. Внутри тела значение параметра int присваивается полю, то есть значение параметра копируется в поле. Таким образом, поле инициализируется для данного значения параметра.

Ключевое слово this перед именем поля (this.number) необязательно. Оно просто сообщает компилятору, что это поле с именем number, на которое ссылаются.

Конструктор по умолчанию, без аргументов

Вам не нужно определять конструктор для класса, но если вы не этого не сделаете, компилятор вставит для вас конструктор по умолчанию без аргументов. Таким образом, когда класс скомпилирован, у него всегда будет конструктор без аргументов.

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

Параметры

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

В этом примере объявлены 3 параметра: первый, последний и год. Внутри тела значения этих трех параметров присваиваются полям объекта Employee.

Разрывы строки на Java после каждого параметра являются необязательными. Компилятор здесь игнорирует разрывы строк. Вы также можете написать объявление параметра в одну строку, если хотите, например:

Чтобы вызвать этот конструктор, который принимает три параметра, вы должны создать экземпляр объекта Employee следующим образом:

Параметры передаются конструктору в скобках после имени класса справа от знака равенства. Затем объект создается, и конструктор выполняется. После выполнения описанного выше конструктора поля, инициализированные им, будут иметь значения параметров, передаваемых ему.

Параметр конструктора может иметь то же имя, что и поле. В этом случае у компилятора возникают проблемы, зная, на что вы ссылаетесь. По умолчанию, если параметр (или локальная переменная) имеет то же имя, что и поле в том же классе, параметр (или локальная переменная) «затеняет» поле. Посмотрите на этот пример:

Внутри конструктора класса Employee идентификаторы firstName, lastName и birthYear теперь ссылаются на параметры конструктора, а не на поля Employee с одинаковыми именами. Таким образом, конструктор теперь просто устанавливает параметры, равные им самим. Поля Сотрудника никогда не инициализируются.

Чтобы сообщить компилятору, что вы имеете в виду поля класса Employee, а не параметры, поместите ключевое слово this и точку перед именем поля:

Теперь поля Employee правильно инициализируются внутри конструктора.

Вызов

Вы вызываете конструктор, когда создаете новый экземпляр класса, содержащий его:

Этот пример вызывает конструктор без аргументов для MyClass, как определено ранее в этом тексте.

Если вы хотите передать параметры конструктору, вы должны включить их в круглые скобки после имени класса:

Этот пример передает один параметр конструктору MyClass, который принимает int в качестве параметра.

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

В Java можно вызвать конструктор из другого конструктора. Для этого используется ключевое слово this:

Обратите внимание на второе определение конструктора. Внутри тела конструктора вы найдете этот оператор Java:

Ключевое слово this, за которым следуют скобки и параметры, означает, что вызывается другой конструктор в том же классе. Какой другой вызываемый конструктор зависит от того, какие параметры вы передаете в вызов конструктора (в скобках после ключевого слова this). В этом примере это первый конструктор в классе, который вызывается.

Вызов в суперклассах

В класс может расширять другой. В этом случае говорят, что он «наследует» от класса, который он расширяет. Расширяемый класс называется подклассом, а расширяемый – суперклассом.

Класс, который расширяет другой, не наследует его конструкторы. Однако подкласс должен вызывать конструктор в суперклассе внутри одного из конструкторов подкласса!

Класс Car расширяет (наследует) класс Vehicle:

Обратите внимание на конструктор в классе Car. Он вызывает конструктор в суперклассе, используя этот оператор:

Использование ключевого слова super относится к суперклассу класса. Когда за ключевым словом следуют круглые скобки, как здесь, это относится к конструктору в суперклассе. В этом случае это относится к конструктору в классе Vehicle. Поскольку Car расширяет Vehicle, все конструкторы Car должен вызывать конструктор в Vehicle.

Модификаторы доступа

Модификатор доступа конструктора определяет, какие классы в вашем приложении могут вызывать его. Например, если конструктор объявлен защищенным, то он может вызывать только классы в одном пакете или подклассы этого класса.

Класс может иметь несколько конструкторов, а каждый конструктор свой собственный модификатор доступа. Таким образом, некоторые конструкторы могут быть доступны для всех классов в вашем приложении, в то время как другие конструкторы доступны только для классов в том же пакете, подклассах или даже только для самого класса (частные конструкторы).

Исключение

Можно сгенерировать исключение из конструктора:

Обратите внимание на исключительную часть throws объявления конструктора. Она объявляет, что конструктор может выдать исключение. Если это произойдет, созданный экземпляр Car недействителен.

Вот пример вызова конструктора Car:

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

Создание конструктора, создающего исключение, может быть хорошей идеей, если хотите предотвратить создание объекта данного класса в недопустимом состоянии. Обычно это входные параметры конструктора, которые могут привести к тому, что объект будет недействительным. Если конструктор обнаруживает неверный входной параметр, он вызывает исключение и предотвращает присвоение объекта какой-либо переменной.

\begin</p>
<p>class TAirplan < string Name; double Altitude; double MaxAltitude = 12000; void IncAltitude(double delta) < Altitude += delta; if(Altitude >MaxAltitude) < Altitude = MaxAltitude; >> > \end

TAirplan

Теперь у нас есть новый тип данных - . Если мы попробуем использовать этот класс следующим образом:

\begin<verbatim></p>
<p>TAirplan Airplan; Airplan.Name =

то обнаружим следующие ошибки. Во-первых, для создания экземпляра класса недостаточно объявить соответствующую переменную. Экземпляр класса необходимо создать с помощью оператора New . Дело в том, что переменная типа класса на самом деле является не переменной, а ссылкой на переменную. По сути ссылка - это адрес в памяти, где должна храниться переменная . Поэтому процедура создания класса включает в себя выделение соответствующей памяти, инициализации полей класса и присвоение ссылке адреса выделенной памяти. Создать экземпляр нашего класса можно следующим образом:

\begin</p>
<p>TAirplan Airplan = new TAirplan(); \end

Во-вторых, использование полей класса и вызов его методов в строках:

\begin<verbatim></p>
<p>Airplan.Name =

  • public
  • protected
  • private
  • new
  • internal
  • static
  • readonly
  • volatile

Некоторые спецификаторы могут использоваться совместно, а некоторые являются взаимоисключающими. По умолчанию, если не указан спецификатор доступа, полям и методам присваивается спецификатор private . Этот спецификатор означает, что к данному полю и методу невозможно обратиться из другого класса и даже из класса - наследника нашего класса. Спецификатор аналогичен спецификатору за исключением того, что поля и методы с этим спецификатором "видны" для классов наследников данного класса. Наиболее либеральным является спецификатор . К полям и методам, помеченным этим спецификатором, можно обращаться из любых других классов. Может показаться, что легче всего помечать все поля и методы , чтобы "не мучаться". Часто начинающие программисты именно так и поступают. Однако такой подход противоречит идеологии объектно-ориентированного программирования. Важная идея инкапсуляции состоит в сокрытии внутренних полей и методов от внешней среды. Может показаться удивительным, но порой чем меньше мы знаем о внутреннем устройстве класса, тем легче и безопаснее им пользоваться.

Возвращаясь к нашему примеру, разумно дать возможность вызывать метод для изменения высоты. Для этого нужно назначить для метода спецификатор доступа - . Но не стоит давать возможность пользователям класса самостоятельно изменять высоту путем доступа к полю , поскольку тогда возможно превышение порога высоты. В тоже время, если у поля будет спецификатор доступа , то пользователь не сможет не только изменить это поле , но и прочитать. Для этого нужно создать еще один метод, который будет выдавать пользователю значение высоты:

\begin</p>
<p>public double GetAltitude() < return Math.Round(Altitude); >\end

Заметим, что таким образом мы контролируем, чтобы пользователь всегда получал значение высоты, округленное до ближайшего целого.

Однако если мы создадим наш класс в таком виде:

\begin</p>
<p>class TAirplan < string Name; double Altitude; double MaxAltitude = 12000; void IncAltitude(double delta) < Altitude += delta; if(Altitude >MaxAltitude) < Altitude = MaxAltitude; >> public double GetAltitude() < return Math.Round(Altitude); >> \end

и попробуем его использовать таким образом:

\begin<verbatim></p>
<p>TAirplan Airplan = new TAirplan(); // создать объект Airplan.IncAltitude(100); // увеличить высоту Console.WriteLine(

  1. Имя конструктора всегда совпадает с именем класса. Никакой другой метод не может иметь имя, совпадающее с именем класса.
  2. Конструктор не имеет возвращаемого типа. Никакой другой метод не может не иметь возвращаемого типа.
  3. Конструктор можно вызвать только путем создания экземпляра класса.

Добавим в наш класс конструктор :

\begin</p>
<p>class TAirplan < public readonly string Name; double Altitude; double MaxAltitude = 12000; public TAirplan(string Name, double Altitude) < this.Name = Name; this.Altitude = Altitude; >public void IncAltitude(double delta) < . >public double GetAltitude() < . >> \end

Теперь создавать экземпляр нашего класса нужно следующим образом:

\begin<verbatim></p>
<p>TAirplan Airplan = new TAirplan(

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

Рассмотренная выше технология программирования называется инкапсуляцией. Инкапсуляцией называется технология программирования, при которой реализуется тщательный контроль доступа к внутренним полям и методам класса. На наш взгляд инкапсуляция является наиболее важным принципом объектно-ориентированного программирования.

Ключевые термины

Класс - пользовательский тип данных , который включает в себя как данные, так и программный код в виде функций.

Конструктор - метод, который всегда вызывается при создании экземпляра класса.

Ссылка - именованный адрес в памяти, где хранится переменная , для доступа к этой переменной.

Экземпляр класса - переменная типа класс .

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

Передача методу скрытого параметра this

В явном виде параметр this применяется для того, чтобы возвратить из метода ссылку на вызвавший объект , а также для идентификации поля в случае, если его имя совпадает с именем параметра метода, например:

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

Конструктор предназначен для инициализации объекта. Он вызывается автоматически при создании объекта класса с помощью операции new . Имя конструктора совпадает с именем класса. Ниже перечислены свойства конструкторов

  • Конструктор не возвращает значение, даже типа void .
  • Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.
  • Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов — значение null .
  • Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

До сих пор мы задавали начальные значения полей класса при описании класса. Это удобно в том случае, когда для всех экземпляров класса начальные значения некоторого поля одинаковы. Если же при создании объектов требуется присваивать полю разные значения, это следует делать в конструкторе. В листинге 5.6 в класс Demo добавлен конструктор , а поля сделаны закрытыми.

Часто бывает удобно задать в классе несколько конструкторов, чтобы обеспечить возможность инициализации объектов разными способами. Все конструкторы должны иметь разные сигнатуры.

Если один из конструкторов выполняет какие-либо действия, а другой должен делать то же самое плюс еще что-нибудь, удобно вызвать первый конструктор из второго. Для этого используется уже известное вам ключевое слово this в другом контексте, например:

Конструкция, находящаяся после двоеточия, называется инициализатором.

До сих пор речь шла об "обычных" конструкторах, или конструкторах экземпляра. Существует второй тип конструкторов — статические конструкторы, или конструкторы класса. Конструктор экземпляра инициализирует данные экземпляра, конструктор класса — данные класса.

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

Некоторые классы содержат только статические данные и, следовательно, создавать экземпляры таких объектов не имеет смысла. В версию 2.0 введена возможность описывать статический класс , то есть класс с модификатором static . Экземпляры такого класса создавать запрещено, и кроме того, от него запрещено наследовать. Все элементы такого класса должны явным образом объявляться с модификатором static ( константы и вложенные типы классифицируются как статические элементы автоматически). В листинге 5.7 приведен пример статического класса.

Результат работы программы:

Свойства

Свойства служат для организации доступа к полям класса. Как правило, свойство связано с закрытым полем класса и определяет методы его получения и установки. Синтаксис свойства:

Значения спецификаторов для свойств и методов аналогичны. Чаще всего свойства объявляются со спецификатором public . Код доступа представляет собой блоки операторов, которые выполняются при получении ( get ) или установке ( set ) свойства. Может отсутствовать либо часть get , либо set , но не обе одновременно.

Пример описания свойств:

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

В программе свойство выглядит как поле класса, например:

При обращении к свойству автоматически вызываются указанные в нем методы чтения и установки.

Синтаксически чтение и запись свойства выглядят почти как методы. Метод get должен содержать оператор return . В методе set используется параметр со стандартным именем value , который содержит устанавливаемое значение .

Добавим в класс Monster , описанный в листинге 5.8, свойства, позволяющие работать с закрытыми полями этого класса. Код класса несколько разрастется, зато упростится его использование.

Результат работы программы:

Вопросы и задания для самостоятельной работы студента

Лабораторные работы

Лабораторная работа № 4. Простейшие классы

Разрабатываемый класс должен содержать следующие элементы: скрытые поля, конструкторы с параметрами и без параметров, методы, свойства. Методы и свойства должны обеспечивать непротиворечивый, полный, минимальный и удобный интерфейс класса. При возникновении ошибок должны выбрасываться исключения.

Задание

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

Читайте также: