что такое public в java

8. Java — Модификаторы доступа и класса

Модификаторы — ключевые слова, которые Вы добавляете при инициализации для изменения значений. Язык Java имеет широкий спектр модификаторов, основные из них:

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

Содержание

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

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

Модификатор доступа по умолчанию — без ключевого слова

Модификатор доступа по умолчанию — означает, что мы явно не объявляем модификатор доступа в Java для класса, поля, метода и т.д.

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

Пример

Переменные и методы могут быть объявлены в Java без каких-либо модификаторов, как показано в следующем примере:

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

Модификатор private — методы, переменные и конструкторы, которые объявлены как private в Java могут быть доступны только в пределах самого объявленного класса.

Модификатор доступа private является наиболее ограничивающим уровенем доступа. Класс и интерфейсы не могут быть private.

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

Использование модификатора private в Java является основным способом, чтобы скрыть данные.

Пример

Следующий класс использует контроль доступа private:

Здесь переменная format класса Logger является private, так что нет никакого способа для других классов, чтобы получить и установить её значение напрямую.

Таким образом, чтобы эта переменная была доступна для всего, мы определили два открытых (public) метода: getFormat(), который возвращает значение format, и setFormat(String), который устанавливает её значение.

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

Модификатор public — класс, метод, конструктор, интерфейс и т.д. объявленные как public могут быть доступны из любого другого класса. Поэтому поля, методы, блоки, объявленные внутри public класса могут быть доступны из любого класса, принадлежащего к «вселенной» Java.

Тем не менее, если к public классу в другом пакете мы пытаемся получить доступ, то public класс приходится импортировать.

Благодаря наследованию классов, в Java все публичные (public) методы и переменные класса наследуются его подклассами.

Пример

Следующая функция использует контроль доступа public:

Метод main() должен быть публичным (public). В противном случае, он не может быть вызван с помощью java-интерпретатора, чтобы запустить класс.

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

Модификатор protected — переменные, методы и конструкторы, которые объявляются как protected в суперклассе, могут быть доступны только для подклассов в другом пакете или для любого класса в пакете класса protected.

Модификатор доступа protected в Java не может быть применен к классу и интерфейсам. Методы и поля могут быть объявлены как protected, однако методы и поля в интерфейсе не могут быть объявлены как protected.

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

Пример

Следующий родительский класс использует контроля доступа protected, чтобы его дочерний класс переопределил метод openSpeaker():

При этом, если мы определим метод openSpeaker() как protected, то он не будет доступен из любого другого класса, кроме AudioPlayer. Если мы определим его как public, то он станет доступным всем. Но наше намерение состоит в том, чтобы раскрыть этот метод только подклассу, вот почему мы использовали модификатор protected.

Правила контроля доступа и наследования

Следующие правила в Java применяются для унаследованных методов:

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

Java предоставляет ряд модификаторов не для доступа, а для реализации многих других функциональных возможностей:

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

Модификатор static — применяется для создания методов и переменных класса.

Переменные static

Ключевое слово static используется для создания переменных, которые будут существовать независимо от каких-либо экземпляров, созданных для класса. Только одна копия переменной static в Java существует вне зависимости от количества экземпляров класса.

Статические переменные также известны как переменные класса. В Java локальные переменные не могут быть объявлены статическими (static).

Методы static

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

В Java статические методы или методы static не используют какие-либо переменные экземпляра любого объекта класса, они определены. Методы static принимают все данные из параметров и что-то из этих параметров вычисляется без ссылки на переменные.

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

Пример

Модификатор static в Java используется для создания методов классов и переменных, как показано в следующем примере:

Будет получен следующий результат:

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

Модификатор final — используется для завершения реализации классов, методов и переменных.

Переменные final

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

Однако данные внутри объекта могут быть изменены. Таким образом, состояние объекта может быть изменено, но не ссылки.

С переменными в Java модификатор final часто используется со static, чтобы сделать константой переменную класса.

Пример

Методы final

Метод final не может быть переопределен любым подклассом. Как упоминалось ранее, в Java модификатор final предотвращает метод от изменений в подклассе.

Главным намерение сделать метод final будет то, что содержание метода не должно быть изменено стороне.

Пример

Объявление метода, использующего модификатор final в объявление класса, показано в следующем примере:

Класс final

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

Пример

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

Модификатор abstract — используется для создания абстрактных классов и методов.

Класс abstract

Класс abstract не может создать экземпляр. Если класс объявлен как abstract, то единственная цель для него быть расширенным.

Класс не может быть одновременно abstract и final, так как класс final не может быть расширенным. Если класс содержит абстрактные методы, то он должен быть объявлен как abstract. В противном случае будет сгенерирована ошибка компиляции.

Класс abstract может содержать как абстрактные методы, а также и обычные.

Пример

Метод abstract

Метод abstract является методом, объявленным с любой реализацией. Тело метода (реализация) обеспечивается подклассом. Методы abstract никогда не могут быть final или strict.

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

Если класс в Java содержит один или несколько абстрактных методов, то класс должен быть объявлен как abstract. Абстрактный класс не обязан содержать абстрактные методы.

Абстрактный метод заканчивается точкой с запятой. Пример: public abstract sample();

Пример

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

Модификатор synchronized — используются в Java для потоков.

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

Пример

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

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

Этот модификатор включён в оператор, что создает переменную, предшествующего класса или типа данных переменной.

Пример

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

Модификатор volatile — используются в Java для потоков.

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

Доступ к переменной volatile синхронизирует все кэшированные скопированные переменные в оперативной памяти. Volatile может быть применен только к переменным экземпляра, которые имеют тип объект или private. Ссылка на объект volatile может быть null.

Пример

Как правило, run() вызывается в одном потоке (впервые начинаете использовать Runnable в Java), а stop() вызывается из другого потока. Если в линии 1 используется кэшированное значение active, то цикл не может остановиться, пока Вы не установите active false в линии 2.

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

Источник

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

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

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

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

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

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

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

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

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

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

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

Источник

BestProg

Содержание

Поиск на других ресурсах:

1. Что такое инкапсуляция в классе?
2. Какие существуют категории доступности членов данных класса в языке Java?

В языке Java выделяются 4 категории доступности:

3. Какие преимущества дает использование механизма инкапсуляции в классе?

Инкапсуляция данных в классе дает следующие преимущества:

4. Какие модификаторы доступа применяются к данным из методов класса?

Для управления доступом к данным из методов класса, в Java используются следующие модификаторы доступа:

5. Какая общая форма объявления элемента класса с заданным модификатором доступа?

Модификатор доступа к конкретному члену данных или методу устанавливается перед его объявлением.
Общая форма класса, в котором объявляются один член данных класса и один метод следующая

Такой способ скрытия данных в классе есть эффективным в случаях, если нужно:

Реализация класса DayWeek следующая

Использовать такой класс в другом коде (методе) можно, например, следующим образом

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

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

Тогда, доступ из другого пакета Package2 к переменной value может быть:

Следует заметить, если в пакете Package2 размещается директива

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

Из вышеприведенного кода можно сделать следующий вывод:

Рассмотрим это на примере.

Если снять комментарий из строки

то компилятор выдаст ошибку

9. Особенности доступа к элементам класса в случае отсутствия модификатора доступа. Примеры

При объявлении модификатор доступа к членам класса может отсутствовать. В этом случае к члену класса имеют доступ:

Запрещен доступ из других пакетов к элементам класса не имеющим модификатора доступа.

Пример 1. В примере демонстрируется доступ к переменной value класса A из методов других классов. Переменная value класса A объявлена без модификатора доступа.

Как видно из примера, попытка вызвать строку

из пакета Package2 вызовет ошибку компилятора со следующим сообщением

Это значит, что поле value класса DemoPackage1 есть невидимым.

10. Какой тип доступа имеют члены класса по умолчанию?

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

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

Текст объявления и использования класса имеет вид:

Как видно из объявления класса, в методе UseCData() будет вызван скрытый ( private ) конструктор с одним параметром

В результате выполнения вышеприведенного кода, на экран будет выведено:

Источник

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

Источник

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

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

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

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

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

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

что такое public в java. access modifiers. что такое public в java фото. что такое public в java-access modifiers. картинка что такое public в java. картинка access modifiers. Модификаторы — ключевые слова, которые Вы добавляете при инициализации для изменения значений. Язык 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.

Источник

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

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