Модификаторы доступа в Java

Модификаторы доступа в Java

1. обзор

В этом руководстве мы рассмотрим модификаторы доступа в Java, которые используются для установки уровня доступа к классам, переменным, методам и конструкторам.

Simply put, there are four access modifiers:public,private,protected иdefault (без ключевого слова).

Прежде чем мы начнем, отметим, что класс верхнего уровня может использовать только модификаторы доступаpublic илиdefault. На уровне участника мы можем использовать все четыре.

2. По умолчанию

Когда мы не используем ключевое слово явно, Java устанавливает доступdefault к данному классу, методу или свойству. Модификатор доступа по умолчанию также называетсяpackage-private, что означает, чтоall members are visible within the same package, но недоступен из других пакетов:

package com.example.accessmodifiers;

public class SuperPublic {
    static void defaultMethod() {
        ...
    }
}

defaultMethod() доступен в другом классе того же пакета:

package com.example.accessmodifiers;

public class Public {
    public Public() {
        SuperPublic.defaultMethod(); // Available in the same package.
    }
}

Однако он недоступен в других пакетах.

3. общественного

Если мы добавим ключевое словоpublic к классу, методу или свойству, тогдаwe’re making it available to the whole world, т.е. все остальные классы во всех пакетах смогут использовать его. Это наименее ограничивающий модификатор доступа:

package com.example.accessmodifiers;

public class SuperPublic {
    public static void publicMethod() {
        ...
    }
}

publicMethod() доступен в другом пакете:

package com.example.accessmodifiers.another;

import com.example.accessmodifiers.SuperPublic;

public class AnotherPublic {
    public AnotherPublic() {
        SuperPublic.publicMethod(); // Available everywhere. Let's note different package.
    }
}

4. Частный

Любой метод, свойство или конструктор с ключевым словомprivateis accessible from the same class only. Это наиболее ограничивающий модификатор доступа и является основой концепции инкапсуляции. Все данные будут скрыты от внешнего мира:

package com.example.accessmodifiers;

public class SuperPublic {
    static private void privateMethod() {
        ...
    }

     private void anotherPrivateMethod() {
         privateMethod(); // available in the same class only.
    }
}

5. защищенный

Между уровнями доступаpublic иprivate есть модификатор доступаprotected.

Если мы объявляем метод, свойство или конструктор с ключевым словомprotected, мы можем получить доступ к члену изsame package (as with package-private access level) and in addition from all subclasses of its class, даже если они находятся в других пакетах:

package com.example.accessmodifiers;

public class SuperPublic {
    static protected void protectedMethod() {
        ...
    }
}

protectedMethod() доступен в подклассах (независимо от пакета):

package com.example.accessmodifiers.another;

import com.example.accessmodifiers.SuperPublic;

public class AnotherSubClass extends SuperPublic {
    public AnotherSubClass() {
        SuperPublic.protectedMethod(); // Available in subclass. Let's note different package.
    }
}

6. сравнение

В таблице ниже приведены доступные модификаторы доступа. Мы видим, что класс, независимо от используемых модификаторов доступа, всегда имеет доступ к своим членам:

Модификатор

Учебный класс

пакет

Подкласс

Мир

public

Y

Y

Y

Y

protected

Y

Y

Y

N

default

Y

Y

N

N

private

Y

N

N

N

7. Заключение

В этой короткой статье мы рассмотрели модификаторы доступа в Java.

Хорошей практикой является использование максимально ограниченного уровня доступа для любого конкретного участника, чтобы предотвратить неправильное использование. Мы всегда должны использовать модификатор доступаprivate, если нет веской причины не делать этого.

Уровень доступаPublic следует использовать только в том случае, если член является частью API.

Как всегда доступны примеры кодаover on Github.