Java обеспечивает контроль доступа через три модификатора — public, protected and private. Мы не обязаны использовать эти модификаторы доступа всегда, поэтому у нас есть еще модификатор доступа по умолчанию, а именно default access, package-private или no modifier.
Мы можем использовать модификаторы доступа с классами, а также переменными класса и методами.
Модификаторы доступа Java Class
Разработчики языка разрешили использовать только «public» или «default» для работы с Java классами.
- Если класс «public», то мы можем получить к нему доступ из любой точки мира, то есть от любого другого класса, расположенного в каких-либо других пакетах и т.д.
- Мы можем иметь только один «public» класс в исходном файле. Также следует указать, что имя файла должно быть таким же, как имя public-класса.
- Если класс имеет «default access» (доступ по умолчанию), то он может быть доступен только из других классов в одном пакете.
Приведенные выше правила применяются и к внутренним классам.
Модификаторы доступа в Java классе
Мы можем иметь все четыре модификатора доступа для переменных-членов класса и методов. Однако правила доступа для членов класса будут применимы только после правил доступа на уровне класса. Например, если класс, имеющий доступ по умолчанию (default access), то он не будет виден в других пакетах и, следовательно, методы и переменные класса также будут не видны.
Мы будем изучать каждый случай в отдельности, а затем покажем доступы в простой программе.
Модификатор public
Если член класса «public», то он может быть использован в любом месте. Переменная или метод имеет доступ в глобальном масштабе. Это простой способ обеспечить доступ к членам класса, однако мы должны заботиться в использовании этого ключевого слова/модификатора с переменными класса, в противном случае кто-нибудь может изменить значения. Обычно переменные класса private, а доступ к этим переменным осуществляется через getter-setter методы.
Модификатор private
Если член класса «private», то он будет доступен только внутри того же класса. Это наиболее ограниченный доступ, поэтому член класса не будет виден для внешнего мира. Обычно переменные класса и методы, предназначенные для использования только внутри класса, делают private.
Модификатор protected
Если член класса «protected», то он будет доступен только для классов в одном пакете и в подклассах. Этот модификатор менее ограничен, чем private, но более ограничен, чем public. Обычно мы используем это ключевое слово/модификатор, чтобы убедиться, что переменные класса доступны только для подклассов.
Модификатор default
Если в члене класса не указан какой-либо модификатор доступа, то он имеет доступ по умолчанию (default). Правила доступа подобны классам и членам класса с доступом по умолчанию. В этом случае доступ будет только для классов в одном пакете. Этот доступ является более ограниченным, чем public и protected, но менее ограничен, чем private.
Цепочка доступности: от менее доступных к более доступным
(менее доступный) private < default < protected < public (самый доступный)
Давайте напишем несколько простых классов, где мы увидим модификаторы доступа в действии.
TestA.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package ua.com.prologistic.access; class TestA { public static void methodPublic(){ methodPrivate(); } protected static void methodProtected(){ methodPrivate(); } static void methodDefault(){ methodPrivate(); } private static void methodPrivate(){} } |
Обратите внимание, что класс TestA имеет доступ по умолчанию
TestB.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package ua.com.prologistic.access; import ua.com.prologistic.access.TestA; public class TestB { public static void main(String args[]){ TestA.methodPublic(); TestA.methodProtected(); TestA.methodDefault(); } public static void methodPublic(){ } protected static void methodProtected(){ } static void methodDefault(){ } private static void methodPrivate(){} } |
Обратите внимание, что TestB находится в том же пакете, что и класс TestA, следовательно, может получить доступ к членам класса. Private-члены не доступны, но все остальные члены доступны из-за того же пакета.
TestC.java
1 2 3 4 5 6 7 8 9 10 11 |
package ua.com.prologistic.access.child; import ua.com.prologistic.access.TestB; public class TestC { public static void main(String[] args) { TestB.methodPublic(); } } |
Класс TestB доступен, потому что он public. Только public-члены класса TestB доступны, потому что класс TestC не в том же пакете, и не подкласс класса TestB.
TestE.java
1 2 3 4 5 6 7 8 9 10 11 12 |
package ua.com.prologistic.util; import ua.com.prologistic.access.TestB; public class TestE extends TestB { public static void main(String[] args) { TestB.methodPublic(); TestB.methodProtected(); } } |
Как только класс ТестE стал подклассом TestB, мы можем получить доступ к защищенным членам класса TestB.
Вот и все модификаторы доступа в Java. Только не путайте default и protected доступы. Легкий способ помнить, что доступ по умолчанию (default ) является более ограниченным, чем protected, а также то, что protected-члены доступны в подклассах.
Следите за обновлениями на prologistic.com.ua