что такое public private protected
В чем разница между public, protected и private доступом?
Примеры:
public function doSomething() <
private function doSomething() <
protected function doSomething() <
Ответ 1
public область видимости используется, чтобы сделать это свойство/метод доступным из любого места, других классов и экземпляров объекта.
private область видимости, если необходимо, чтобы ваше свойство/метод было видно только в его собственном классе.
Если вы не используете модификатор видимости, свойство/метод будут общедоступными.
Ответ 2
Public:
Тот же класс, который его объявил.
Классы, наследующие объявленный выше класс.
Любые внешние элементы вне этого класса также могут получить доступ к ним.
Пример:
class Daddy extends GrandPa <
// Public переменная, которая доступна также из внешнего класса!
$outsiderWantstoKnowGrandpasName = new GrandPa;
Protected:
Тот же класс, который его объявил.
Классы, наследующие объявленный выше класс.
Внешние члены не могут получить доступ к этим переменным. «Внешние» в том смысле, что они не являются экземплярами объекта самого объявленного класса.
Пример:
class Daddy extends GrandPa <
$outsiderWantstoKnowGrandpasName = new GrandPa;
Точная ошибка будет такой:
Private:
Тот же класс, который его объявил.
Внешние члены не могут получить доступ к этим переменным. «Внешние» в том смысле, что они не являются экземплярами объекта самого объявленного класса и даже не являются классами, наследующими объявленный класс.
Пример:
class Daddy extends GrandPa<
$outsiderWantstoKnowGrandpasName = new GrandPa;
Сообщения об ошибках будут следующими:
Примечание: Неопределенное свойство: Daddy::$name
Неустранимая ошибка: невозможно получить доступ к частному свойству GrandPa::$name
Ответ 3
Обычно хорошей практикой считается установка по умолчанию минимальной требуемой видимости, поскольку это способствует инкапсуляции данных и хорошему дизайну интерфейса. При рассмотрении переменной-члена и видимости метода подумайте о роли, которую член играет во взаимодействии с другими объектами.
Если вы «кодируете интерфейс, а не реализацию», то обычно довольно просто принимать решения о видимости. В общем, переменные должны быть закрытыми или защищенными, если у вас нет веских причин для их раскрытия. Вместо этого используйте общедоступные методы доступа (геттеры/сеттеры) для ограничения и регулирования доступа к внутренним компонентам класса.
Водитель не знает и не должен заботиться о том, как эти действия реализуются внутренними компонентами автомобиля, и раскрытие этой функции может быть опасно для водителя и других людей на дороге. Следовательно, хорошая практика разработки общедоступного интерфейса и инкапсуляции данных за этим интерфейсом.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Модификаторы доступа Java – Public, Private, Protected
Во время работы с Java встречаются public, protected and private – это модификаторы доступа. Модификатор доступа в Java(Access Modifiers) ограничивает доступ к классу, конструктору, данным и методам в другом классе. Есть четыре типа:
Модификатор доступа по умолчанию
Если не упоминается какой-либо модификатор доступа, он называется модификатором доступа по умолчанию. Область применения ограничена только пакетом.
Это означает, что если у нас есть класс в пакете, то только те классы, которые находятся в этом пакете, могут обращаться к этому классу.
Никакой другой класс за пределами этого пакета не может получить доступ к этому классу. Точно так же, если у нас есть метод или элемент данных по умолчанию в классе, он не будет виден в классе другого пакета.
Пример модификатора доступа по умолчанию в Java
В этом примере у нас есть два класса, класс Test пытается получить доступ к методу по умолчанию класса Addition, поскольку класс Test принадлежит другому пакету, эта программа выдаст ошибку компиляции, поскольку область действия модификатора по умолчанию ограничена одним и тем же пакетом в котором он объявлен.
Вывод:
Exception in thread «main» java.lang.Error: Unresolved compilation problem:
The method addTwoNumbers(int, int) from the type Addition is not visible
at xyzpackage.Test.main(Test.java:12)
чем отличаются модификаторы доступа
Модификатор личного(private) доступа
Область применения модификатора private ограничена только классом.
Пример использования private
В этом примере выдается ошибка компиляции, поскольку мы пытаемся получить доступ к частному члену данных и методу класса ABC в классе Example. Элемент данных и метод private доступны только внутри класса.
Protected – защищенный доступ
Элемент данных и метод protected доступны только классам одного и того же пакета и подклассам, присутствующим в любом пакете. Также можно сказать, что модификатор защищенного доступа похож на модификатор доступа по умолчанию, за одним исключением, что он имеет видимость в подклассах.
Классы не могут быть объявлены protected. Этот модификатор обычно используется в родительских дочерних отношениях.
Пример protected
В этом примере класс Test, присутствующий в другом пакете, может вызвать метод addTwoNumbers(), который объявлен как protected. Это связано с тем, что класс Test расширяет класс Addition, а protected разрешает доступ защищенным членам в подклассах (в любых пакетах).
Public – публичный доступ
Члены, методы и классы, которые объявлены как public, могут быть доступны из любого места. Этот модификатор не накладывает никаких ограничений на доступ.
Пример применения public
Давайте возьмем тот же пример, который мы видели выше, но на этот раз метод addTwoNumbers() имеет public модификатор, и класс Test может получить доступ к этому методу, даже не расширяя класс Addition.
Это потому, что публичный модификатор виден везде.
Addition.java
Средняя оценка / 5. Количество голосов:
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Введение в ООП с примерами на C#. Часть пятая. Всё о модификаторах доступа
Авторизуйтесь
Введение в ООП с примерами на C#. Часть пятая. Всё о модификаторах доступа
В прошлых статьях серии «Введение в ООП» мы рассматривали полиморфизм (а также нюансы использования его на практике), наследование и абстрактные классы. В этой части я постараюсь раскрыть все тонкости использования модификаторов доступа, которые знаю сам. Продолжаем погружаться в ООП!
Что такое модификаторы доступа?
Давайте в этот раз возьмём определение из Википедии (в русской Википедии статьи access modifiers нет, поэтому здесь приводим свой перевод — прим. перев.) :
Модификаторы доступа (или спецификаторы доступа) — ключевые слова в объектно-ориентированных языках, которые задают (внезапно!) параметры доступа для классов, методов и прочих элементов. Модификаторы доступа — специфичная часть языков программирования для облегчения инкапсуляции компонентов.
Модификаторы public, private, protected
Традиционно сразу переходим к практике. Давайте попробуем выполнить следующий код:
Результатом выполнения этого кода будет:
Теперь попробуем получить доступ к AAA() напрямую:
‘AccessModifiers.Modifiers.AAA()’ is inaccessible due to its protection level
Модификаторы доступа и наследование
Снова попробуем выполнить код:
Запускаем код и видим…
‘AccessModifiers.ModifiersBase.AAA()’ is inaccessible due to its protection level
Приватные члены недоступны даже дочерним классам. Публичные члены доступны всем, это понятно. Модификатор же protected по сути и обозначает, что член доступен только дочерним классам — вызов CCC() в примере выше не вызывает никаких ошибок.
Модификатор Internal для классов
Давайте рассмотрим следующий сценарий: мы создаём в новой библиотеке классов (назовём её AccessModifiersLibrary ) класс ClassA и помечаем его как internal :
Теперь в созданном ранее файле попробуем выполнить:
Compile time error: ‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
Модификаторы для пространств имён
Давайте попробуем сделать с предыдущим кодом следующее:
Конечно, это не скомпилируется:
Compile time error: A namespace declaration cannot have modifiers or attributes
Приватные классы
Если мы попробуем скомпилировать код, приведённый выше, то получим ошибку:
Compile time error: Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal
Подробнее о модификаторах членов класса
Что будет, если мы захотим назначить члену класса больше одного модификатора доступа?
Будет ошибка компиляции:
Compile time error: More than one protection modifier
А как поведёт себя язык, если мы создадим public метод в internal классе?
Вывод после компиляции:
‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
The type ‘AccessModifiersLibrary.ClassA’ has no constructors defined
‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
‘AccessModifiersLibrary.ClassA’ does not contain a definition for ‘MethodClassA’ and
no extension method ‘MethodClassA’ accepting a first argument of type ‘AccessModifiersLibrary.ClassA’
could be found (are you missing a using directive or an assembly reference?)
Как много ошибок… Дело в том, что какими бы модификаторами не обладали члены internal класса, их всё равно нельзя вызвать оттуда, где не виден сам класс. А что будет, если мы попробуем сделать наоборот — вызвать private или internal метод у public класса?
‘AccessModifiersLibrary.ClassA’ does not contain a definition
for ‘MethodClassA’ and no extension method ‘MethodClassA’ accepting a first argument
of type ‘AccessModifiersLibrary.ClassA’ could be found (are you missing a using directive or an assembly reference?)
‘AccessModifiersLibrary.ClassA’ does not contain a definition for ‘MethodClassA’ and no extension
method ‘MethodClassA’ accepting a first argument of type ‘AccessModifiersLibrary.ClassA’ could be
found (are you missing a using directive or an assembly reference?)
Увы, так делать тоже нельзя.
Модификатор protected internal
Этот код компилируется без ошибок. Модификатор internal proteted (как не слишком сложно догадаться) даёт понять, что метод доступен как для вызовов из того же файла, в котором он объявлен, так и для вызовов из дочерних классов.
Protected поля
Здесь всё будет немного сложнее. Давайте напишем следующий код:
Если мы его запустим, то получим ошибку:
Cannot access protected member ‘AccessModifiers.AAA.a’ via a qualifier of type ‘AccessModifiers.AAA’;
the qualifier must be of type ‘AccessModifiers.BBB’ (or derived from it)
25–27 ноября, Онлайн, Беcплатно
(От редакции) Скорее всего, это сделано, чтобы нельзя было делать следующим образом:
Приоритет модификаторов
Compile time error: Inconsistent accessibility: base class ‘AccessModifiers.AAA’ is less accessible than class ‘AccessModifiers.BBB’
Inconsistent accessibility: return type ‘AccessModifiers.AAA’ is less accessible than method ‘AccessModifiers.BBB.MethodB()’
Inconsistent accessibility: field type ‘AccessModifiers.AAA’ is less accessible than field ‘AccessModifiers.BBB.aaa’
Подведём итоги:
Работу с константами и sealed классами (которая тоже осуществляется за счёт модификаторов доступа) мы разберём в следующей статье.
Модификаторы доступа (Руководство по программированию в C#)
Все типы и члены типов имеют уровень доступности. Он определяет возможность их использования из другого кода в вашей или в других сборках. Следующие модификаторы доступа позволяют указать доступность типа или члена при объявлении:
Сводная таблица
Расположение вызывающего объекта | public | protected internal | protected | internal | private protected | private |
---|---|---|---|---|---|---|
В классе | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Производный класс (та же сборка) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
Непроизводный класс (та же сборка) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ |
Производный класс (другая сборка) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Непроизводный класс (другая сборка) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
В следующих примерах показано, как изменить модификаторы доступа для типа или члена типа:
Не все модификаторы доступа подходят для всех типов или членов во всех контекстах. В некоторых случаях доступность члена типа ограничивается доступностью содержащего его типа.
Доступность классов, записей и структур
Доступность членов классов, записей и структур
Как правило, уровень доступности члена не может быть выше уровня доступности типа, в который он входит. При этом член public внутреннего класса может быть доступен за пределами сборки, если он реализует методы интерфейса или переопределяет виртуальные методы, определенные в открытом базовом классе.
Методы завершения не могут иметь модификаторы доступа.
Другие типы
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.