Статья

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

В этой статье мы рассмотрим модификаторы доступа в Java, которые используются для настройки уровня доступа к классам, переменным, методам и конструкторам.
Существует четыре модификатора доступа: public, private, protected и default (без ключевого слова).
Прежде чем мы начнем, давайте отметим, что класс верхнего уровня может использовать только public или default модификаторы доступа. На уровне членов классов мы можем использовать все четыре типа доступа.

Default

Когда мы явно не используем какое-либо ключевое слово, Java установит доступ по умолчанию (default) к данному классу, методу или свойству. Модификатор доступа по умолчанию также называется package-private, что означает, что все элементы видны в одном пакете, но недоступны из других пакетов:
package com.test.accessmodifiers;

public class SuperClass {
    static void defaultMethod() {
        ...
    }
}
defaultMethod() доступен в другом классе того же пакета:
package com.test.accessmodifiers;

public class Public {
    public Public() {
        SuperClass.defaultMethod(); 
        // метод доступен в том же пакете
    }
}
Однако этот метод недоступен в других пакетах.

Public

Если мы добавляем ключевое слово public к классу, методу или свойству, то мы делаем его доступным для всего мира, т.е. все остальные классы во всех пакетах смогут его использовать. Это наименее ограничивающий модификатор доступа:
package com.test.accessmodifiers;

public class SuperClass {
    public static void publicMethod() {
        ...
    }
}
publicMethod() доступен в другом пакете:
package com.test.accessmodifiers.another;

import com.test.accessmodifiers.SuperClass;

public class AnotherClass {
    public AnotherClass() {
        SuperClass.publicMethod(); 
        // метод доступен в любом пакете
    }
}

Private

Любой метод, свойство или конструктор с ключевым словом private доступен только из того же класса. Это самый ограничительный модификатор доступа, лежащий в основе концепции инкапсуляции. Все данные будут скрыты от внешнего мира:
package com.test.accessmodifiers;

public class SuperClass {
    static private void privateMethod() {
        ...
    }
    
     private void anotherPrivateMethod() {
         privateMethod(); 
         // доступен только в этом же классе
    }
}

Protected

Между уровнями public и private доступа есть модификатор защищенного доступа – protected.
Если мы объявляем метод, свойство или конструктор с ключевым словом protected, мы можем получить доступ к члену из того же пакета (как и с уровнем доступа package-private) и, кроме того, из всех подклассов его класса, даже если они находятся в других пакетах:
package com.test.accessmodifiers;

public class SuperClass {
    static protected void protectedMethod() {
        ...
    }
}
protectedMethod() доступен в подклассах (независимо от пакета):
package com.test.accessmodifiers.another;

import com.test.accessmodifiers.SuperClass;

public class AnotherSubClass extends SuperClass {
    public AnotherSubClass() {
        SuperClass.protectedMethod(); 
        // доступен в подклассе, несмотря на другой пакет
    }
}
В таблице ниже приведены краткие сведения о доступных модификаторах доступа. Мы можем видеть, что класс, независимо от используемых модификаторов доступа, всегда имеет доступ к своим членам:
МодификаторКлассПакетПодкласс Полная видимость
publicДаДаДаДа
protectedДаДаДаНет
defaultДаДаНетНет
privateДаНетНетНет

Заключение

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