private что такое в java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Controlling Access to Members of a Class

Access level modifiers determine whether other classes can use a particular field or invoke a particular method. There are two levels of access control:

The following table shows the access to members permitted by each modifier.

Access Levels

ModifierClassPackageSubclassWorld
publicYYYY
protectedYYYN
no modifierYYNN
privateYNNN

The first data column indicates whether the class itself has access to the member defined by the access level. As you can see, a class always has access to its own members. The second column indicates whether classes in the same package as the class (regardless of their parentage) have access to the member. The third column indicates whether subclasses of the class declared outside this package have access to the member. The fourth column indicates whether all classes have access to the member.

Access levels affect you in two ways. First, when you use classes that come from another source, such as the classes in the Java platform, access levels determine which members of those classes your own classes can use. Second, when you write a class, you need to decide what access level every member variable and every method in your class should have.

Let’s look at a collection of classes and see how access levels affect visibility. The following figure shows the four classes in this example and how they are related.

private что такое в java. Смотреть фото private что такое в java. Смотреть картинку private что такое в java. Картинка про private что такое в java. Фото private что такое в java

Classes and Packages of the Example Used to Illustrate Access Levels

The following table shows where the members of the Alpha class are visible for each of the access modifiers that can be applied to them.

Visibility

ModifierAlphaBetaAlphasubGamma
publicYYYY
protectedYYYN
no modifierYYNN
privateYNNN

If other programmers use your class, you want to ensure that errors from misuse cannot happen. Access levels can help you do this.

Источник

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

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

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

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

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

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

private что такое в java. Смотреть фото private что такое в java. Смотреть картинку private что такое в java. Картинка про private что такое в java. Фото private что такое в javaМодификаторы доступа в 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 private в Java просто и понятно (или немного ООП)

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

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

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

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

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

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

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

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

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

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

Источник

Модификаторы доступа Java – Public, Private, Protected

Во время работы с Java встречаются public, protected and private – это модификаторы доступа. Модификатор доступа в Java(Access Modifiers) ограничивает доступ к классу, конструктору, данным и методам в другом классе. Есть четыре типа:

private что такое в java. Смотреть фото private что такое в java. Смотреть картинку private что такое в java. Картинка про private что такое в java. Фото private что такое в java

Модификатор доступа по умолчанию

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

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

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

Пример модификатора доступа по умолчанию в 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 что такое в java. Смотреть фото private что такое в java. Смотреть картинку private что такое в java. Картинка про private что такое в java. Фото private что такое в java чем отличаются модификаторы доступа

Модификатор личного(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. Количество голосов:

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

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

Источник

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

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