Поиск…


Синтаксис

  • 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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow