Java Language
Видимость (контроль доступа к членам класса)
Поиск…
Синтаксис
- public type name [= value];
- имя частного типа [= значение];
- имя защищенного типа [= значение];
- имя типа [= значение];
- public class name {
- имя класса {
замечания
Из учебника Java :
Модификаторы уровня доступа определяют, могут ли другие классы использовать конкретное поле или вызвать конкретный метод. Существует два уровня контроля доступа:
- На верхнем уровне -
publicили package-private (без явного модификатора). - На уровне участника -
public,private,protectedили пакетно-закрытый (без явного модификатора).
Класс может быть объявлен public модификатором, и в этом случае этот класс будет виден всем классам. Если класс не имеет модификатора (по умолчанию, также известного как private-package ), он отображается только в пределах его собственного пакета.
На уровне члена вы также можете использовать public модификатор или модификатор ( private-package ), как и классы верхнего уровня, и с тем же значением. Для участников есть два дополнительных модификатора доступа: private и protected . private модификатор указывает, что к члену можно получить доступ только в своем классе. protected модификатор указывает, что к члену можно получить доступ только в своем собственном пакете (как и в пакете private ) и, кроме того, подклассе его класса в другом пакете.
В следующей таблице показан доступ к членам, разрешенным каждым модификатором.
Уровни доступа:
| Модификатор | Учебный класс | пакет | Подкласс | Мир |
|---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
| нет модификатора | Y | Y | N | N |
private | Y | N | N | N |
Элементы интерфейса
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
Члены интерфейса всегда имеют общедоступную видимость, даже если ключевое слово public опущено. Таким образом, как foo() , bar() , TEXT , ANSWER , X , так и Y имеют общую видимость. Тем не менее, доступ по-прежнему может ограничиваться содержащимся интерфейсом - поскольку MyInterface имеет общедоступную видимость, к его членам можно получить доступ из любого места, но если у MyInterface была видимость пакета, его члены были бы доступны только из одного и того же пакета.
Общественная видимость
Видно для класса, пакета и подкласса.
Давайте посмотрим пример с классом Test.
public class Test{
public int number = 2;
public Test(){
}
}
Теперь попробуем создать экземпляр класса. В этом примере мы можем получить доступ к number потому что он является public .
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
Частная видимость
private видимость позволяет доступ к переменной только для своего класса. Они часто используются вместе с public геттерами и сеттерами.
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
Видимость пакета
Без модификатора значение по умолчанию - видимость пакета. Из документации Java «[видимость пакета] указывает, имеют ли классы в том же пакете, что и класс (независимо от их происхождения), доступ к члену». В этом примере из javax.swing ,
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics находится в одном пакете, поэтому DEBUG_GRAPHICS_LOADED доступен.
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
В этой статье приводятся некоторые сведения об этой теме.
Защищенная видимость
Защищенная видимость приводит к тому, что этот элемент видим для своего пакета вместе с любым из его подклассов.
В качестве примера:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
Теперь мы расширим этот класс и попытаемся получить доступ к одному из его protected членов.
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
Вы также сможете получить доступ к protected члену без его расширения, если вы получаете доступ к нему из одного пакета.
Обратите внимание, что этот модификатор работает только с членами класса, а не с самим классом.
Резюме модификаторов доступа к члену класса
| Модификатор доступа | видимость | наследование |
|---|---|---|
| Частный | Только класс | Не может быть унаследован |
| Нет модификатора / пакета | В пакете | Доступно, если подкласс в пакете |
| защищенный | В пакете | Доступно в подклассе |
| общественного | Везде | Доступно в подклассе |
Когда-то был private protected (оба ключевых слова сразу), который можно было применить к методам или переменным, чтобы сделать их доступными из подкласса вне пакета, но сделать их закрытыми для классов в этом пакете. Однако это было удалено в выпуске Java 1.0 .