Как сделать поля класса закрытыми

Добавил пользователь Alex
Обновлено: 04.10.2024

Классы и структуры — это, по сути, шаблоны, по которым можно создавать объекты. Каждый объект содержит данные и методы, манипулирующие этими данными.

Общая форма определения класса

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

Данные-члены

Данные-члены — это те члены, которые содержат данные класса — поля, константы, события. Данные-члены могут быть статическими (static). Член класса является членом экземпляра, если только он не объявлен явно как static. Давайте рассмотрим виды этих данных:

Поля (field)

Это любые переменные, ассоциированные с классом.

Константы

Константы могут быть ассоциированы с классом тем же способом, что и переменные. Константа объявляется с помощью ключевого слова const. Если она объявлена как public, то в этом случае становится доступной извне класса.

События

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

Функции-члены

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

Методы (method)

Это функции, ассоциированные с определенным классом. Как и данные-члены, по умолчанию они являются членами экземпляра. Они могут быть объявлены статическими с помощью модификатора static.

Свойства (property)

Конструкторы (constructor)

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

Финализаторы (finalizer)

Вызываются, когда среда CLR определяет, что объект больше не нужен. Они имеют то же имя, что и класс, но с предшествующим символом тильды. Предсказать точно, когда будет вызван финализатор, невозможно.

Операции (operator)

Индексаторы (indexer)

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

Класс создается с помощью ключевого слова class. Ниже приведена общая форма определения простого класса, содержащая только переменные экземпляра и методы:

Обратите внимание на то, что перед каждым объявлением переменной и метода указывается доступ. Это спецификатор доступа, например public, определяющий порядок доступа к данному члену класса. Члены класса могут быть как закрытыми (private) в пределах класса, так открытыми (public), т.е. более доступными. Спецификатор доступа определяет тип разрешенного доступа. Указывать спецификатор доступа не обязательно, но если он отсутствует, то объявляемый член считается закрытым в пределах класса. Члены с закрытым доступом могут использоваться только другими членами их класса.

Давайте разберем пример создания класса, описывающего характеристики пользователя:

В данном примере определяется новый пользовательский класс UserInfo, который содержит 4 поля и 1 метод, которые являются открытыми (т.е. содержат модификатор доступа public). В методе Main() создаются два экземпляра этого класса: myInfo и myGirlFriendInfo. Затем инициализируются поля данных экземпляров и вызывается метод writeInConsoleInfo().

Прежде чем двигаться дальше, рассмотрим следующий основополагающий принцип: у каждого объекта имеются свои копии переменных экземпляра, определенных в его классе. Следовательно, содержимое переменных в одном объекте может отличаться от их содержимого в другом объекте. Между обоими объектами не существует никакой связи, за исключением того факта, что они являются объектами одного и того же типа. Так, если имеются два объекта типа UserInfo, то у каждого из них своя копия переменных Name, Family, Age и Adress, а их содержимое в обоих объектах может отличаться:

Поле Java – это переменная внутри класса. Например, в классе, представляющем сотрудника, класс Работник может содержать следующие поля:

  • имя;
  • позиция;
  • оплата труда;
  • дата поступления на работу.

Может быть определен так:

Синтаксис объявления поля

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

Некоторые из приведенных выше вариантов более подробно описаны в следующих разделах.

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

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

  • частный доступ – означает, что только код внутри самого класса может получить доступ к этому полю;
  • к пакету – означает, что только код внутри самого класса или других классов в том же пакете может получить доступ к полю. Вы на самом деле не пишете модификатор пакета. Оставляя любой модификатор доступа, модификатор доступа по умолчанию устанавливается в область действия пакета;
  • защищенный доступ – похож на модификатор пакета, за исключением того, что подклассы класса также могут обращаться к полю, даже если подкласс не находится в том же пакете;
  • открытый доступ – означает, что к полю могут обращаться все классы Java в вашем приложении.

Вот несколько примеров:

Вышеупомянутое использование модификаторов доступа к полю используется только в этом примере. Вы можете не использовать модификаторы доступа в одном классе. Чаще всего применяются частные и защищенные. Для простых классов переноса данных все поля объявляют открытыми.

Статические и нестатические поля

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

Статические поля Java расположены в классе, а не в экземплярах класса

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

Статические поля расположены в классе, поэтому вам не нужен экземпляр для доступа к статическим полям. Вы просто пишете имя впереди, вот так:

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

Нестатические поля Java расположены в экземплярах класса

Вы определяете нестатическое поле, просто опуская ключевое слово static. Вот пример:

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

Окончательные

Поле может быть объявлено окончательным. Не может иметь измененное значение после назначения. Для объявления добавляете ключевое слово final:

Значение поля field1 не может быть изменено сейчас. Это означает, что даже если поле принадлежит объектам, вы не можете изменять значение поля от объекта к объекту.

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

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

Именование

Имя поля используется для ссылки на это поле из вашего кода:

  • Первая строка создает новый объект Customer (экземпляр класса Customer) и сохраняет его в переменной с именем customer.
  • Вторая строка присваивает значение String New York для поля города объектов Customer.
  • Третья строка выводит значение поля города на вывод консоли.

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

Начальное значение

Поле может иметь начальное значение, которое присваивается при создании в JVM. Статические поля создаются при загрузке класса. Класс загружается при первом обращении к нему в вашей программе. Нестатические поля создаются при создании объекта, которому они принадлежат.

Вот пример поля, объявленного с начальным значением:

Хотите ли вы инициализировать свои поля (и другие переменные) начальным значением, решать вам.

На этом уроке мы рассмотрим, что такое спецификаторы доступа в языке С++, какие они бывают и как их использовать.

Спецификаторы доступа

Рассмотрим следующую программу:

С другой стороны, рассмотрим следующий почти идентичный класс:

Хотя члены класса являются закрытыми по умолчанию, мы можем сделать их открытыми, используя ключевое слово public:

Поскольку теперь члены класса DateClass являются открытыми, то к ним можно получить доступ напрямую из функции main().

В языке C++ есть 3 уровня доступа:

спецификатор public делает члены открытыми;

спецификатор private делает члены закрытыми;

спецификатор protected открывает доступ к членам только для дружественных и дочерних классов (детально об этом на соответствующем уроке).

Использование спецификаторов доступа

Классы могут использовать (и активно используют) сразу несколько спецификаторов доступа для установки уровней доступа для каждого из своих членов. Обычно переменные-члены являются закрытыми, а методы — открытыми. Почему именно так? Об этом мы поговорим на следующем уроке.

Правило: Устанавливайте спецификатор доступа private переменным-членам класса и спецификатор доступа public — методам класса (если у вас нет веских оснований делать иначе).

Рассмотрим пример класса, который использует спецификаторы доступа private и public:

Результат выполнения программы:

Обратите внимание, хоть мы и не можем получить доступ к переменным-членам объекта date напрямую из main() (так как они являются private по умолчанию), мы можем получить доступ к ним через открытые методы setDate() и print()!

Некоторые программисты предпочитают сначала перечислить private-члены, а затем уже public-члены. Они руководствуются следующей логикой: public-члены обычно используют private-члены (те же переменные-члены в методах класса), поэтому имеет смысл сначала определять private-члены, а затем уже public-члены. Другие же программисты считают, что сначала нужно указывать public-члены. Здесь уже иная логика: поскольку private-члены закрыты и получить к ним доступ напрямую нельзя, то и выносить их на первое место тоже не нужно. Работать будет и так, и так. Какой способ использовать — выбирайте сами, что вам удобнее.

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

Например, в классе Person заданы следующие поля:

private string name; // задается значение "" private int age; // задается значение 0 private double salary; // задается значение 0.0

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

Если полям класса не задается значение при объявлении, то они автоматически инициализируются значениями по умолчанию. Для значащих переменных – это нулевое значение, для строк – это пустая строка, а для ссылочных переменных – это стандартное значение null, как показано в комментариях описания класса Person.

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

int days = age * 365; // age – поле данного объекта return days:

В качестве модификатора поля может использоваться ключевое слово static, обозначающее, что это статическое поле. Например, в классе Person может быть описано следующее статическое поле:

static int numPersons=0; // кол-во объектов класса

Статическое поле класса создастся только одно для всего класса. Для обращения к нему нужно указать имя класса и через точку – имя статического поля. Например:

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

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