java - описание - в чем разница между модификаторами видимости public и protected




В чем разница между общедоступными, защищенными, пакетными и частными в Java? (16)

В Java существуют ли четкие правила, когда использовать каждый из модификаторов доступа, а именно, по умолчанию (закрытый пакет), public , protected и private , делая class и interface и занимаясь наследованием?


Частный

  • Методы, переменные и конструкторы

Методы, переменные и конструкторы, объявленные частными, могут быть доступны только в объявленном классе.

  • Класс и интерфейс

Модификатор частного доступа является самым ограничивающим уровнем доступа. Класс и интерфейсы не могут быть частными.

Заметка

Переменные, объявленные как private, могут быть доступны вне класса, если в классе присутствуют общедоступные методы getter. Переменные, методы и конструкторы, объявленные защищенными в суперклассе, могут быть доступны только подклассам другого пакета или любого класса в пакете класса защищенных членов.

защищенный

  • Класс и интерфейс

Модификатор защищенного доступа не может применяться к классу и интерфейсам.

Методы, поля могут быть объявлены защищенными, однако методы и поля в интерфейсе не могут быть объявлены защищенными.

Заметка

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

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

Доступ к классу, методу, конструктору, интерфейсу и т. Д. Может быть доступен из любого другого класса.

Поэтому поля, методы, блоки, объявленные внутри открытого класса, могут быть доступны из любого класса, принадлежащего к Java Universe.

  • Различные пакеты

Однако, если открытый класс, к которому мы пытаемся получить доступ, находится в другом пакете, тогда публичный класс по-прежнему необходимо импортировать.

Из-за наследования классов все общедоступные методы и переменные класса наследуются подклассами.

По умолчанию - Нет ключевого слова:

Модификатор доступа по умолчанию означает, что мы явно не объявляем модификатор доступа для класса, поля, метода и т. Д.

  • В пределах тех же пакетов

Переменная или метод, объявленный без модификатора управления доступом, доступен для любого другого класса в одном пакете. Поля в интерфейсе неявно являются публичными статическими, а методы в интерфейсе по умолчанию являются общедоступными.

Заметка

Мы не можем переопределить статические поля. Если вы пытаетесь переопределить его, он не показывает никаких ошибок, но он не работает, кроме нас.

Ответы на вопросы

Ссылки ссылки

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm


(Caveat: Я не программист на Java, я программист Perl. Perl не имеет формальных защит, возможно, поэтому я так хорошо понимаю проблему :))

Частный

Как вы думаете, это может увидеть только класс, в котором он объявлен.

Частный пакет

Может отображаться и использоваться только пакетом, в котором он был объявлен. Это значение по умолчанию в Java (которое некоторые считают ошибкой).

защищенный

Пакет Private + можно увидеть подклассами или членами пакета.

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

Все это видят.

Published

Видимый вне кода, который я контролирую. (Хотя это не синтаксис Java, это важно для этого обсуждения).

C ++ определяет дополнительный уровень, называемый «friend», и чем меньше вы знаете, тем лучше.

Когда вы должны использовать что? Вся идея заключается в инкапсуляции, чтобы скрыть информацию. Насколько это возможно, вы хотите скрыть детали того, как что-то делается от ваших пользователей. Зачем? Потому что тогда вы можете изменить их позже и не нарушать чей-то код. Это позволяет оптимизировать, реорганизовывать, реорганизовывать и исправлять ошибки, не опасаясь, что кто-то использует этот код, который вы только что пересмотрели.

Таким образом, эмпирическое правило заключается в том, чтобы сделать вещи такими же видимыми, какими они должны быть. Начните с частных и только добавьте больше видимости по мере необходимости. Публикуйте только то, что абсолютно необходимо для пользователя, чтобы знать, каждая деталь, которую вы делаете публичными судорогами, позволяет вам перепроектировать систему.

Если вы хотите, чтобы пользователи могли настраивать поведение, а не открывать внутренности, чтобы они могли переопределить их, часто лучше перетащить эти кишки в объект и сделать этот интерфейс общедоступным. Таким образом, они могут просто подключить новый объект. Например, если вы пишете проигрыватель компакт-дисков и хотите, чтобы бит «идти найти информацию об этом компакт-диске» настраивался, а не публиковать эти методы, вы включили бы все эти функции в свой собственный объект и сделали бы свой объект getter / setter общедоступным , Таким образом, скупость о том, чтобы разоблачить ваши кишки, поощряет хороший состав и разделение проблем

Лично я придерживаюсь только «частных» и «публичных». У многих языков OO есть это. «Защищенный» может пригодиться, но это действительно чит. Когда интерфейс более чем частный, он находится вне вашего контроля, и вам нужно искать в коде других людей, чтобы найти пользу.

Здесь возникает идея «опубликования». Изменение интерфейса (рефакторинг) требует, чтобы вы нашли весь код, который его использует, и также измените его. Если интерфейс частный, то проблем нет. Если он защищен, вам нужно найти все ваши подклассы. Если это общедоступно, вам нужно найти весь код, который использует ваш код. Иногда это возможно, например, если вы работаете с корпоративным кодом, который используется только для внутреннего использования, не имеет значения, открыт ли интерфейс. Вы можете извлечь весь код из корпоративного репозитория. Но если интерфейс «опубликован», если есть код, использующий его вне вашего контроля, тогда вы будете закрыты. Вы должны поддерживать этот интерфейс или код нарушения риска. Даже защищенные интерфейсы можно считать опубликованными (поэтому я не беспокоюсь о защите).

Многие языки находят иерархическую природу public / protected / private слишком ограничивающей и не соответствующей действительности. С этой целью существует концепция класса признаков , но это еще одно шоу.


Видимый для пакета. По умолчанию. Модификаторы не нужны.

Видимый только для класса ( закрытый ).

Видно миру ( общественность ).

Видимый для пакета и всех подклассов ( защищенных ).

Переменные и методы могут быть объявлены без каких-либо модификаторов, которые вызываются. Примеры по умолчанию:

String name = "john";

public int age(){
    return age;
}

Модификатор частного доступа - частный:

Методы, переменные и конструкторы, объявленные частными, могут быть доступны только в объявленном классе.Модификатор частного доступа является самым ограничивающим уровнем доступа. Класс и интерфейсы не могут быть частными.

Переменные, объявленные как private, могут быть доступны вне класса, если в классе присутствуют общедоступные методы getter.

Использование частного модификатора - это основной способ, которым объект инкапсулирует себя и скрывает данные из внешнего мира.

Примеры:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

Модификатор общедоступного доступа - общедоступный:

Доступ к классу, методу, конструктору, интерфейсу и т. Д. Может быть доступен из любого другого класса. Поэтому поля, методы, блоки, объявленные внутри открытого класса, могут быть доступны из любого класса, принадлежащего к юниверситету Java.

Однако, если открытый класс, к которому мы пытаемся получить доступ, находится в другом пакете, тогда публичный класс по-прежнему необходимо импортировать.

Из-за наследования классов все общедоступные методы и переменные класса наследуются подклассами.

Пример:

public void cal(){

}

Защищенный защитник доступа - защищен:

Переменные, методы и конструкторы, которые объявлены защищенными в суперклассе, могут быть доступны только подклассам в другом пакете или любом классе внутри пакета класса защищенных членов.

Модификатор защищенного доступа не может применяться к классу и интерфейсам. Методы, поля могут быть объявлены защищенными, однако методы и поля в интерфейсе не могут быть объявлены защищенными.

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

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

Вот лучшая версия таблицы. (Будущее доказательство с колонкой для модулей.)

Пояснения

  • Частный член доступен только в том же классе, который был объявлен.

  • Член без модификатора доступа доступен только в классах одного и того же пакета.

  • Защищенный член доступен во всех классах одного и того же пакета и внутри подклассов в других пакетах.

  • Публичный член доступен для всех классов (если он не находится в module , который не экспортирует пакет, в котором он объявлен).

Какой модификатор выбрать?

Модификаторы доступа - это инструмент, который поможет вам предотвратить случайное нарушение инкапсуляции (*) . Спросите себя, хотите ли вы, чтобы член был чем-то внутренним для класса, пакета, иерархии классов или вообще не был внутренним, и соответственно выберите уровень доступа.

Примеры:

  • long internalCounter запрос должен быть закрытым, поскольку он изменен и детализация реализации.
  • Класс, который должен быть создан только в фабричном классе (в том же пакете), должен иметь конструктор с ограниченным пакетом, поскольку его нельзя будет вызывать непосредственно извне пакета.
  • Внутренний метод void beforeRender() который void beforeRender() непосредственно перед рендерингом и используется как подкласс в подклассах, должен быть защищен.
  • void saveGame(File dst) который вызывается из кода GUI, должен быть общедоступным.

(*) Что такое инкапсуляция?


Модификаторы доступа предназначены для ограничения доступа на нескольких уровнях.

Публикация. Это в основном так же просто, как вы можете получить доступ из любого класса, будь то в одном пакете или нет.

Чтобы получить доступ, если вы находитесь в одном пакете, вы можете получить доступ напрямую, но если вы находитесь в другом пакете, вы можете создать объект класса.

По умолчанию: он доступен в одном пакете из любого класса пакета.

Для доступа вы можете создать объект класса. Но вы не можете получить доступ к этой переменной за пределами пакета.

Защищено: вы можете обращаться к переменным в том же пакете, а также подклассе в любом другом пакете. поэтому в основном это значение по умолчанию + Наследуемое поведение.

Чтобы получить доступ к защищенному полю, определенному в базовом классе, вы можете создать объект дочернего класса.

Частный: это может быть доступ в том же классе.

В нестатических методах вы можете получить доступ непосредственно из-за этой ссылки (также в конструкторах), но для доступа к статическим методам вам нужно создать объект класса.


Простое правило. Начните с объявления всех частных. И затем прогресс в отношении общественности по мере возникновения потребностей, и дизайн ее оправдывает.

Когда выставлять участников, спросите себя, подвергаете ли вы выбор выбора или выбор абстракции. Первое - это то, чего вы хотите избежать, поскольку оно будет вводить слишком много зависимостей от фактического представления, а не от его наблюдаемого поведения.

Как правило, я стараюсь избегать переопределения реализации метода путем подкласса; слишком легко испортить логику. Объявите абстрактные защищенные методы, если вы намерены переопределить его.

Кроме того, используйте аннотацию @Override, когда вы переопределяете, чтобы вещи не ломались, когда вы реорганизуете.


Самый непонятый модификатор доступа в Java protected . Мы знаем, что он похож на модификатор по умолчанию с одним исключением, в котором подклассы могут его видеть. Но как? Вот пример, который, надеюсь, прояснит путаницу:

  • Предположим, что у нас есть 2 класса; Father и Son , каждый в своем собственном пакете:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • Давайте добавим защищенный метод foo() к Father .

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • Метод foo() можно вызвать в четырех контекстах:

    1. Внутри класса, который находится в том же пакете, где определен foo() ( fatherpackage ):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. Внутри подкласса, в текущем экземпляре с помощью this или super :

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
    3. На ссылке, тип которой является одним и тем же классом:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
      
    4. На ссылке, тип которой является родительским классом, и находится внутри пакета, где определен foo() ( fatherpackage ) [Это может быть включено внутри контекста no. 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
  • Следующие ситуации недействительны.

    1. В ссылке, тип которой является родительским классом, и она находится вне пакета, где определяется foo() ( fatherpackage ):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
    2. Неподкласс в пакете подкласса (подкласс наследует защищенные члены от его родителя и делает их частными для не-подклассов):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      

Это на самом деле немного сложнее, чем простые сетки. В сетке указано, разрешен ли доступ, но что именно представляет собой доступ? Кроме того, уровни доступа взаимодействуют с вложенными классами и наследованием сложными способами.

Доступ по умолчанию (указанный отсутствием ключевого слова) также называется package-private . Исключение: в интерфейсе никакой модификатор не означает открытый доступ; модификаторы, отличные от общедоступных, запрещены. Константы континуума всегда открыты.

Резюме

Разрешен ли доступ к члену с этим спецификатором доступа?

  • Член private : только если член определен в том же классе, что и вызывающий код.
  • Член закрывается пакетом: только если вызывающий код находится внутри пакета, входящего в состав участника.
  • Участник protected : тот же пакет, или если член определен в суперклассе класса, содержащего вызывающий код.
  • Участник public : Да.

Какие спецификаторы доступа применяются к

Локальные переменные и формальные параметры не могут принимать спецификаторы доступа. Поскольку они по своей сути недоступны снаружи в соответствии с правилами определения области охвата, они фактически являются частными.

Для классов в верхней области допускаются только public и пакетные. Вероятно, этот выбор дизайна обусловлен тем, что protected и private будут избыточными на уровне пакета (наследование пакетов отсутствует).

Все возможности доступа доступны для членов класса (конструкторы, методы и статические функции-члены, вложенные классы).

Связанный: Доступность класса Java

порядок

Спецификаторы доступа могут быть строго упорядочены

public> protected> package-private> private

что означает, что public обеспечивает наибольший доступ, а не меньше. Любая ссылка, доступная для частного члена, также действительна для члена пакета-частного; любая ссылка на член пакета-частного действительна для защищенного члена и так далее. (Предоставление доступа к защищенным членам другим классам в одном пакете считалось ошибкой).

Заметки

  • Методам класса разрешается доступ к закрытым членам других объектов того же класса. Точнее, метод класса C может обращаться к частным членам C на объектах любого подкласса C. Java не поддерживает ограничение доступа экземпляром только по классу. (Сравните с Scala, который поддерживает его с помощью private[this] .)
  • Вам нужен доступ к конструктору для создания объекта. Таким образом, если все конструкторы являются частными, класс может быть создан только кодом, живущим внутри класса (обычно статические фабричные методы или инициализаторы статической переменной). Аналогично для конструкторов private-private или protected.
    • Только наличие частных конструкторов также означает, что класс не может быть подклассифицирован извне, поскольку Java требует, чтобы конструкторы подкласса неявно или явно вызывали конструктор суперкласса. (Однако он может содержать вложенный класс, который подклассифицирует его.)

Внутренние классы

Вы также должны учитывать вложенные области, такие как внутренние классы. Примером сложности является то, что внутренние классы имеют члены, которые сами могут использовать модификаторы доступа. Таким образом, вы можете иметь частный внутренний класс с открытым членом; может ли доступ к члену? (См. Ниже.) Общее правило заключается в том, чтобы взглянуть на область действия и подумать рекурсивно, чтобы узнать, можете ли вы получить доступ к каждому уровню.

Однако это довольно сложно, и для получения полной информации обратитесь к Спецификации Java Language . (Да, в прошлом были ошибки компилятора.)

Чтобы понять, как они взаимодействуют, рассмотрим этот пример. Возможно «утечка» частных внутренних классов; это обычно предупреждение:

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

Выход компилятора:

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

Некоторые связанные вопросы:


Эта страница хорошо пишет об защищенном и стандартном модификаторе доступа

.... Protected: Защищенный модификатор доступа немного сложнее, и вы можете сказать, что это надмножество модификатора доступа по умолчанию. Защищенные члены такие же, как и члены по умолчанию, в отношении доступа в одном пакете. Разница в том, что защищенные члены также доступны для подклассов класса, в которых объявлен член, который находится вне пакета, в котором присутствует родительский класс.

Но эти защищенные члены «доступны вне пакета только через наследование». т.е. вы можете получить доступ к защищенному элементу класса в своем подклассе, присутствующем в каком-либо другом пакете, непосредственно, как если бы член присутствовал в самом подклассе. Но этот защищенный член не будет доступен в подклассе вне пакета, используя ссылку родительского класса. ....


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

Модификаторы доступа Java используются для обеспечения контроля доступа на Java.

1. По умолчанию:

Доступно только для классов только в одном пакете.

Например,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

Этот доступ более ограничен, чем общедоступный и защищенный, но менее ограниченный, чем частный.

2. Общественные

Доступ к ним возможен из любого места. (Глобальный доступ)

Например,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

Вывод: Привет

3. Частный

Доступно только внутри одного класса.

Если вы попытаетесь получить доступ к закрытым членам одного класса в другом, это приведет к ошибке компиляции. Например,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. Защищенный

Доступно только для классов в одном пакете и подклассах

Например,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

Вывод: Привет


Public Protected Default и private - это модификаторы доступа.

Они предназначены для инкапсуляции или скрытия и отображения содержимого класса.

  1. Класс может быть общедоступным или по умолчанию
  2. Члены класса могут быть общедоступными, защищенными, дефолтными или частными.

Частное недоступно вне класса. По умолчанию доступен только в пакете. Защищен в пакете, а также в любом классе, который его расширяет. Общественность открыта для всех.

Обычно переменные-члены определяются частными, но методы-члены являются общедоступными.


Все дело в инкапсуляции (или, как сказал Джо Филлипс, наименьшее знание ).

Начните с самого ограничительного (частного) и посмотрите, не понадобится ли вам менее ограничивающие модификаторы.

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

Например: вы можете ввести чувствительные методы защиты в пакет безопасности. Затем поместите открытый класс, который обращается к некоторому коду безопасности, содержащемуся в этом пакете, но сохраняет другие классы классов безопасности частными . Таким образом, другие разработчики смогут использовать общедоступный класс вне этого пакета (если только они не изменят модификатор). Это не функция безопасности, но будет определять использование.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

Другое дело, что классы, которые сильно зависят друг от друга, могут оказаться в одном пакете и в конечном итоге могут быть реорганизованы или объединены, если зависимость слишком сильная.

Если, наоборот, вы устанавливаете все как общедоступные , неясно, к чему следует или не следует обращаться, что может привести к написанию большого количества javadoc (что ничего не может сделать с помощью компилятора ...).


Ответ Дэвида дает смысл каждого модификатора доступа. Что касается того, когда использовать каждый, я предлагаю публиковать все классы и методы каждого класса, предназначенные для внешнего использования (его API), и все остальное частное.

Со временем у вас возникнет смысл, когда нужно сделать некоторые классы private-private и когда объявлять определенные методы, защищенные для использования в подклассах.


Примечание. Это только дополнение для принятого ответа.

Это связано с модификаторами доступа Java .

Из модификаторов доступа Java :

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

  • Элемент списка
  • частный
  • default (пакет)
  • защищенный
  • общественности

Из раздела «Контроль доступа к членам класса» :

Модификаторы уровня доступа определяют, могут ли другие классы использовать конкретное поле или вызвать конкретный метод. Существует два уровня контроля доступа:

  • На верхнем уровне - общедоступный или пакетно-закрытый (без явного модификатора).
  • На уровне участника - общедоступный, закрытый, защищенный или пакетно-закрытый (без явного модификатора).

Класс может быть объявлен публичным модификатором, и в этом случае этот класс будет виден всем классам. Если класс не имеет модификатора (по умолчанию, также известного как private-package), он отображается только в пределах его собственного пакета

В следующей таблице показан доступ к членам, разрешенным каждым модификатором.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

Первый столбец данных указывает, имеет ли сам класс доступ к члену, определенному уровнем доступа. Как вы можете видеть, у класса всегда есть доступ к своим членам. Во втором столбце указано, имеют ли классы в том же пакете, что и класс (независимо от их происхождения), доступ к члену. Третий столбец указывает, имеют ли подклассы класса, объявленного вне этого пакета, доступ к элементу. В четвертом столбце указано, имеют ли все классы доступ к элементу.

Уровни доступа влияют на вас двумя способами. Во-первых, когда вы используете классы, которые поступают из другого источника, например классы на платформе Java, уровни доступа определяют, какие члены этих классов могут использовать ваши собственные классы. Во-вторых, когда вы пишете класс, вам нужно решить, какой уровень доступа должен иметь каждая переменная-член и каждый метод в вашем классе.


Я просто хочу обратиться к деталям, которые чрезвычайно часто ошибаются, в том числе по большинству ответов на этой странице. Доступ «по умолчанию» (когда нет модификатора доступа) не всегда совпадает с пакетом-частным . Это зависит от того, что это такое.

  • Типы нечленов (то есть классы, перечисления, интерфейсы и типы аннотаций, не объявленные внутри другого типа) по умолчанию являются закрытыми по пакетам. ( JLS §6.6.1 )

  • По умолчанию члены класса и конструкторы являются закрытыми по пакетам. ( JLS §6.6.1 )

  • По умолчанию конструкторы Enum являются закрытыми . (В самом деле, enum contructors должны быть частными, и это ошибка, чтобы попытаться сделать их публичными или защищенными). Константы Enum являются общедоступными и не допускают спецификатор доступа. Другие члены перечисления по умолчанию закрыты по пакетам. ( JLS §8.9 )

  • Все члены интерфейсов и типы аннотаций по умолчанию являются общедоступными . (Действительно, члены интерфейсов и типы аннотаций должны быть общедоступными, и это ошибка, чтобы попытаться сделать их частными или защищенными.) ( JLS §9.3 - 9.5 )


                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    






access-modifiers