Protected java что это

Модификаторы private, protected, public в Java

Модификаторы доступа private, protected, public ставятся перед именем класса, метода или поля и ограничивают доступ к нему. К локальным переменным модификаторы доступа не применимы.
Помимо этих трех явных модификаторов, есть еще так называемый default-модификатор, или модификатор по умолчанию, иначе говоря — это отсутствие всякого модификатора. Но это отсутствие тоже подразумевает свои правила доступа (видимость только внутри пакета).

Зачем нужны модификаторы доступа

Модификаторы доступа существуют для того, чтобы сделать код надежнее и защищеннее. Нужно максимально ограничивать видимость своих классов, методов и полей, и открывать их только там, где это действительно необходимо. Если вы откроете что-то лишнее, то другой разработчик (или даже вы сами) может по ошибке воспользоваться открытым классом/методом. Чем это чревато? А тем, что если в дальнейшем вы исправите свой код (отвечающий за внутреннюю реализацию, но открытый для пользования извне), то код другого программиста перестанет работать, так как опирается на ваш код. Открывать нужно только то, что вы планируете поддерживать и что будет стабильно работать (без изменения контракта) во всех последующих версиях. Все остальное — внутренняя реализация, которая касается только вас и может меняться, ее никто не должен использовать.

Правила доступа

На картинке показаны правила доступа к полю или методу с конкретным модификатором (последний столбец — про модули, они появились в Java 9):

Protected java что это. access modifiers. Protected java что это фото. Protected java что это-access modifiers. картинка Protected java что это. картинка access modifiersМодификаторы доступа в Java

Модификатор private

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

Допустим у нас есть класс A с private полем privateVar и с private методом privateMethod(). Из класса A мы можем обращаться к полю, см. обращение this.privateVar:

А теперь попробуем обратиться к этому полю и методу из класса B, код не скомпилируется:

Вышеприведенный код выдает ошибки компиляции:

Иногда возникает вопрос

Может ли объект A получить доступ к private методам и полям другого объекта A?

Да, может. Обратите внимание на функцию main() из вышеприведенного класса A, в которой создается новый объект A и идет обращение к его методам и полям (не через this):

Как показано выше, мы обращаемся в методе main() к private полю privateVar другого объекта A, и это законно. Все потому, что в Java ограничения доступа применимы на уровне класса, а не на уровне объекта (не обязательно, чтоб обращение шло к тому же экземпляру, главное, что он в том же классе).

Можно ли переопределить private метод?

Нельзя, метод в подклассе не будет иметь никакого отношения к методу в суперклассе, так как private метод нигде не виден. Давайте попытаемся унаследоваться от класса A и «переопределить» private метод privateMethod():

Попробуем создать объект SubA и вызвать privateMethod() на A:

Как видите, срабатывает метод privateMethod() класса A, то есть переопределения не происходит:

Это происходит потому, что метод privateMethod() класса SubA не переопределяет метод privateMethod() класса A, а является независимым методом.

Модификатор default

Если мы не ставим никакого модификатора доступа перед методом, полем или классом, то этот метод/поле/класс видимы из кода только внутри пакета, в котором они находятся.

Давайте продемонстрируем это. Создадим снова класс A в пакете .def:

И создадим в этом же пакете класс B, из которого будем пытаться получить доступ к полям и методам A, как и раньше:

В этот раз код компилируется, все в порядке — доступ есть.

Если бы класс B находится в другом пакете (отличном от ru.sysout.accessmodifiers.def, в том числе в подпакете), то доступа бы не было.

Модификатор protected

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

Снова создадим класс A с protected полем и методом:

Создадим в другом пакете класс C — наследника класса A и попытаемся получить доступ к полям методам класса A из класса C:

Как показано выше, обращение к полю и методу через this работает из другого пакета.

Также работает обращение ко всем другим экземплярам типа C, но к другим экземплярам типа A обращение не работает.

Модификатор public

Тут все просто — к полю и методу с модификатором public имеет доступ любой код. Давайте еще раз перепишем класс A:

И обратимся к его полю и методу из класса B, который находится в другом пакете и никакого отношения к классу A не имеет:

Все получилось, обращение работает.

Какой модификатор выбрать?

Правило выбора модификатора такое — надо по возможности выбирать:

То есть надо максимально ограничивать видимость члена класса. Сначала надо попробовать сделать все private, и при необходимости открывать видимость.

Мы рассмотрели тонкости использования модификаторов доступа. Код примеров можно посмотреть на GitHub.

Источник

Видимость. Спецификаторы доступа

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

Способ доступа определяется модификатором доступа, который добавляется при объявлении. Всего их четыре:

Примеры объявление модификаторов (он всегда должен быть первым):

Как видите, модификатор применим к переменной, методу, классу.

public

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

private

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

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

protected

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

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

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

Рассмотрим вымышленный класс SillySensor

Класс объявлен как public и доступен в других классах. У класса есть переменная sensorData, которая доступна только в своём классе (private). Конструктор доступен в других классах (public). Метод calibrate() работает только внутри класса (private). Метод seedCalibration() доступен в своем классе или в подклассе (protected). Метод getSensorData() доступен в других классах (public).

Источник

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

1. Модификатора доступа и уровни доступа

Очень часто в Java доступ к некоторым членам класса желательно ограничить. Для этого и нужны модификаторы доступа, которые могут присутствовать в объявлении члена класса. Модификатор доступа указывается перед остальной спецификации типа члена, например:

2. Отличие уровня доступа по умолчанию, public и private

Рассмотрим отличие уровня доступа по умолчанию, public и private на следующем примере. В классе Modificators объявлено три переменные с разным уровнем доступа. Внутри самого класса Modificators можно обратится к любой из этих переменных, как показано в методе toString() :

3. Уровень доступа protected в Java

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

Рассмотрим разницу между уровнями доступа на следующем примере.

Объявим в классе Parent три метода с разными уровнями доступа:

Определяем класс наследник в другом пакете:

4. Уровни доступа для класса

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

Когда мы говорим, что код из одного класса ( class A ) имеет доступ к коду из другого класса ( class B ), это означает что класс A может делать одну из трех вещей:

В этом примере показана попытка наследовать класс HotBevarage с уровнем доступа по умолчанию из другого пакета. В этом случае возникнет ошибка компиляции:

Если класс оказывается открытым, он должен быть единственным открытым классом, объявленным в файле, а имя этого файла должно совпадать с именем класса. Например:

Источник

Какие модификаторы доступа существуют в Java?

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

Следующая таблица суммирует, к каким конструкциям Java может применяться каждый модификатор:

privatedefaultprotectedpublic
КлассNoYesNoYes
Вложенный классYesYesYesYes
КонструкторYesYesYesYes
МетодYesYesYesYes
ПоляYesYesYesYes

Private

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

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

Вот пример назначения к полю:

Переменная – long time была помечена как частная. Это означает, что переменная long time внутри класса Clock недоступна из кода вне него.

Доступ к частным полям

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

В приведенном выше примере два метода getTime() и setTime() могут получить доступ к переменной long time. Два метода объявлены как публичные, то есть они могут быть вызваны из кода в любом месте вашего приложения.

Частные конструкторы

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

Эта версия класса Clock содержит приватный конструктор и публичный конструктор. Закрытый конструктор вызывается из публичного (оператор this();). Он также вызывается из статического метода newClock().

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

Default

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

Подклассы не могут получить доступ к методам и переменным-членам (полям) в суперклассе, если эти методы и поля помечены этим модификатором, если только подкласс не находится в том же пакете, что и суперкласс.

Поле времени в классе Clock не имеет модификатора, что означает, что ему неявно назначен по умолчанию. Следовательно, класс ClockReader может считывать переменную-член time объекта Clock при условии, что ClockReader и Clock находятся в одном и том же пакете Java.

Protected

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

В вышеприведенном примере у подкласса SmartClock есть метод getTimeInSeconds(), который обращается к переменной времени Clock суперкласса. Это возможно, даже если Clock и SmartClock не находятся в одном и том же пакете, поскольку поле времени помечено соответствующим модификатором.

Public

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

Поле времени в классе Clock помечено общедоступным модификатором. Поэтому класс ClockReader может обращаться к полю времени в Clock независимо от того, в каком пакете находится ClockReader.

Доступ к классу

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

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

К интерфейсу

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

Модификаторы и наследование

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

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

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

Источник

Модификаторы доступа public, protected и private в Java

Java обеспечивает контроль доступа через три модификатора — public, protected and private. Мы не обязаны использовать эти модификаторы доступа всегда, поэтому у нас есть еще модификатор доступа по умолчанию, а именно default access, package-private или no modifier.

Мы можем использовать модификаторы доступа с классами, а также переменными класса и методами.

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

Разработчики языка разрешили использовать только «public» или «default» для работы с Java классами.

Приведенные выше правила применяются и к внутренним классам.

Модификаторы доступа в Java классе

Мы можем иметь все четыре модификатора доступа для переменных-членов класса и методов. Однако правила доступа для членов класса будут применимы только после правил доступа на уровне класса. Например, если класс, имеющий доступ по умолчанию (default access), то он не будет виден в других пакетах и, следовательно, методы и переменные класса также будут не видны.

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

Модификатор public

Если член класса «public», то он может быть использован в любом месте. Переменная или метод имеет доступ в глобальном масштабе. Это простой способ обеспечить доступ к членам класса, однако мы должны заботиться в использовании этого ключевого слова/модификатора с переменными класса, в противном случае кто-нибудь может изменить значения. Обычно переменные класса private, а доступ к этим переменным осуществляется через getter-setter методы.

Модификатор private

Если член класса «private», то он будет доступен только внутри того же класса. Это наиболее ограниченный доступ, поэтому член класса не будет виден для внешнего мира. Обычно переменные класса и методы, предназначенные для использования только внутри класса, делают private.

Модификатор protected

Если член класса «protected», то он будет доступен только для классов в одном пакете и в подклассах. Этот модификатор менее ограничен, чем private, но более ограничен, чем public. Обычно мы используем это ключевое слово/модификатор, чтобы убедиться, что переменные класса доступны только для подклассов.

Модификатор default

Если в члене класса не указан какой-либо модификатор доступа, то он имеет доступ по умолчанию (default). Правила доступа подобны классам и членам класса с доступом по умолчанию. В этом случае доступ будет только для классов в одном пакете. Этот доступ является более ограниченным, чем public и protected, но менее ограничен, чем private.

Цепочка доступности: от менее доступных к более доступным

(менее доступный) private

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *