Elettracompany.com

Компьютерный справочник
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Public private protected java

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

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

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

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

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

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

Модификаторы доступа в 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.

Читать еще:  Stringbuilder java пример

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

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

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

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

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

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

Читать еще:  Javascript заполнение таблицы

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

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

Модификаторы доступа 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 ограничена только классом.

  1. Методы доступны только внутри класса.
  2. Класс и интерфейс не могут быть объявлены как private.
  3. Если класс имеет закрытый конструктор, вы не можете создать объект этого класса извне класса.

Пример использования private

В этом примере выдается ошибка компиляции, поскольку мы пытаемся получить доступ к частному члену данных и методу класса ABC в классе Example. Элемент данных и метод private доступны только внутри класса.

Output:
Compile — time error

Protected — защищенный доступ

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

Классы не могут быть объявлены protected. Этот модификатор обычно используется в родительских дочерних отношениях.

Пример protected

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

Public — публичный доступ

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

Пример применения public

Давайте возьмем тот же пример, который мы видели выше, но на этот раз метод addTwoNumbers() имеет public модификатор, и класс Test может получить доступ к этому методу, даже не расширяя класс Addition.

Это потому, что публичный модификатор виден везде.
Addition.java

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

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

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

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

  • private (закрытый)
  • public (открытый)
  • protected (защищённый)
  • доступ по умолчанию, когда никакой модификатор не присутствует

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

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

public

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

Предположим, что класс объявлен как public, и в нём имеются два метода. Один private, второй — public. У вас будет доступ к классу и ко второму методу, но не к первому, несмотря на то, что сам класс открыт.

private

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

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

Читать еще:  Console log javascript

protected

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

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

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

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

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

public private в Java просто и понятно (или немного ООП)

А давай те ка по быстрому разберемся, что такое модификаторы доступа в java (public private protected) и зачем они нужны?

Одним из принципов объектно ориентированной технологии программирования является принцип инкапсуляции. Что он из себя представляет? А тут все просто. Суть в том, что каждый объект объединяет в себе данные и методы работы с этими данными, и скрывает особенности реализации от конечного пользователя. Возьмем объект из реальной жизни, например «автомобиль». У этого объекта есть определенные данные например количество топлива в баке, тип двигателя, количество колес, расход топлива, тип тормозной системы и т.д. И есть методы — например завести двигатель, поехать, остановиться. Достаточно много людей понятия не имеет как именно функционирует тот или иной механизм в их автомобиле, однако это вовсе не мешает им ездить каждый день на работу. Дело в том, что у автомобилей есть стандартный интерфейс: педали тормоза, газа, сцепления, руль, рычаг управления коробкой передач (ну если не трогать машины с автоматической коробкой, там все еще проще ). Так вот получается что автомобиль инкапсулирует огромное количество данных и методов, но мы можем пользоваться им не вдаваясь в особенности реализации его конструкции.

То же самое имеет место и в объектно-ориентированном программировании. например мы создаем класс линия:

У нашей линии имеются координаты первой точки и координаты второй точки. Это (x1,y1) и (x2,y2). И имеется конструктор. И то и другое имеет модификатор доступа public. Это значит, что в любом другом классе или объекте мы можем написать такой код:

То есть и поля и методы класса доступны для всех других объектов и классов. Теперь добавим к нашему классу свойство «длина». Получаем такой вот класс:

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

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

Теперь если мы вызовем метод setX1(10) то в этом методе длина отрезка пересчитается автоматически, а значит всегда будет актуальна. А поля которые скрыты за модификатором доступа private будут просто недоступны из других классов и объектов.

Ну с этим вроде понятно, а зачем же нам нужен модификатор protected? А давайте на основе нашего класса создадим линию которая умеет не только изменять свою длину, но и выводить на экран координаты своих концов. Например так:

Оп-па! А вот тут мы сталкиваемся с ошибочкой! Ведь поля класса родителя скрыты от нас, и значит распечатать их мы не можем! Но выход, как говорится, всегда есть. Достаточно просто поменять для полей x1, y1, x2, y2 модификатор доступа private на protected и мы получим доступ к этим полям из всех классов-потомков, однако для других классов они останутся недоступны!

Ссылка на основную публикацию
Adblock
detector