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 .