Модификаторы доступа в Java используются для обеспечения контроля доступа в Java. Java предоставляет контроль доступа с помощью трех ключевых слов – private, protected и public. Всегда не обязательно использовать эти модификаторы доступа, поэтому у нас есть еще один, а именно “доступ по умолчанию“, “пакетный доступ package-private” или “без модификатора no modifier“.
Модификаторы доступа в Java
Мы можем использовать модификаторы доступа Java с классами, а также с переменными и методами класса. Мы можем использовать только модификаторы доступа “public” или “default” с классами Java.
- Если класс “public”, то к нему можно получить доступ откуда угодно, то есть из любого другого класса, расположенного в любом другом пакете и т. д.
- Мы можем иметь только один класс “public” в исходном файле, и имя файла должно совпадать с именем публичного класса.
- Если у класса “доступ по умолчанию”, то к нему можно получить доступ только из других классов в том же пакете.
Модификаторы доступа Java с членом класса
Мы можем использовать все четыре модификатора доступа для переменных и методов членов класса. Однако правила модификатора доступа члена применяются после правил доступа на уровне класса. Например, если у класса установлен доступ по умолчанию, то он не будет виден в других пакетах, и, следовательно, методы и переменные класса также не будут видны. Мы рассмотрим каждый из них отдельно, а затем покажем использование модификаторов доступа в Java на примере простой программы.
Модификаторы доступа в Java – ключевое слово public
Если член класса “public”, то он может быть доступен отовсюду. Переменная члена или метод доступны глобально. Это самый простой способ предоставления доступа к членам класса. Однако следует быть осторожным при использовании этого ключевого слова с переменными класса, иначе любой может изменить их значения. Обычно переменные класса оставляются закрытыми, и для работы с ними предоставляются методы-геттеры и методы-сеттеры.
Модификаторы доступа в Java – ключевое слово private
Если член класса является “private”, то он будет доступен только внутри того же класса. Это самый ограниченный доступ, и член класса не будет виден внешнему миру. Обычно мы устанавливаем переменные класса как private и методы, которые предназначены для использования только внутри класса, также как private.
Модификаторы доступа в Java – ключевое слово protected
Если член класса является “protected”, то он будет доступен только классам в том же пакете и подклассам. Этот модификатор менее ограничен, чем private, но более ограничен, чем public. Обычно мы используем это ключевое слово, чтобы убедиться, что переменные класса доступны только подклассам.
Модификаторы доступа в Java – доступ по умолчанию
Если у члена класса не указан модификатор доступа, то он обрабатывается как доступ по умолчанию. Правила доступа аналогичны классам, и член класса с доступом по умолчанию будет доступен только классам в том же пакете. Этот доступ более ограничен, чем public и protected, но менее ограничен, чем private. (Наименее доступный) private < default < protected < public (Наиболее доступный) Ниже приведена таблица, кратко описывающая вышеупомянутые модификаторы доступа относительно различных классов в одном и том же пакете или других пакетах и подклассах. Давайте напишем несколько простых классов, где мы увидим действие модификаторов доступа Java.
TestA.java
package com.journaldev.access;
class TestA {
public void methodPublic(){
methodPrivate();
}
protected void methodProtected(){
methodPrivate();
}
void methodDefault(){
methodPrivate();
}
private void methodPrivate(){}
}
Обратите внимание, что у класса TestA доступ по умолчанию, и приватный метод класса доступен всем остальным частям того же класса. TestB.java
package com.journaldev.access;
import com.journaldev.access.TestA;
public class TestB {
public static void main(String args[]) {
new TestA().methodPublic();
new TestA().methodProtected();
new TestA().methodDefault();
}
public void methodPublic() {
}
protected void methodProtected() {
}
void methodDefault() {
}
private void methodPrivate() {
}
}
Обратите внимание, что TestB находится в том же пакете, что и класс TestA, и поэтому может обращаться к его членам класса. Приватные члены не доступны, но все остальные члены доступны из-за одного и того же пакета. TestC.java
package com.journaldev.access.child;
import com.journaldev.access.TestB;
public class TestC {
public static void main(String[] args) {
new TestB().methodPublic();
}
}
Класс TestB доступен, потому что он публичный. Доступны только публичные члены класса TestB, потому что класс TestC не находится в том же пакете, ни является его подклассом. TestE.java
package com.journaldev.util;
import com.journaldev.access.TestB;
public class TestE extends TestB {
public static void main(String[] args) {
new TestB().methodPublic();
new TestB().methodProtected(); // compile time error
// работает, обращение к защищенному методу суперкласса с использованием подкласса
new TestE().methodProtected();
}
}
Поскольку класс TestE является подклассом TestB, мы можем получить доступ к защищенным членам TestB через дочерний класс TestE. Если мы попытаемся обратиться к защищенному методу суперкласса напрямую, мы получим ошибку времени компиляции. Вот и все, что касается модификаторов доступа в Java, это просто понять. Просто не путайтесь с доступом по умолчанию и защищенным доступом. Легкий способ запомнить заключается в том, что доступ по умолчанию более ограничен, чем защищенный, и защищенные члены доступны в подклассах. Недавно я сделал видео, чтобы подробно объяснить модификаторы доступа в Java, вы можете посмотреть его ниже на YouTube. https://www.youtube.com/watch?v=QKjnbC3UBtY
Source:
https://www.digitalocean.com/community/tutorials/java-access-modifiers