Модификатор доступа по умолчанию для конструктора Java

может ли кто-нибудь объяснить, что модификатор доступа по умолчанию для явный конструктор no-arg (и других конструкторов)?

4 ответов


конструкторы такие же, как и методы в этом отношении - если вы не даете явный public, private или protected, то конструктор получает видимость "package private" по умолчанию. Он может быть вызван из того же класса или из любого другого класса в том же пакете, но не из подклассов в другом пакете (поэтому, если класс имеет только конструкторы, видимые в пакете, то любые подклассы должны быть в том же пакете).

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


JLS 8.8.9 конструктор по умолчанию

Если класс не содержит объявлений конструктора, автоматически предоставляется конструктор по умолчанию, который не принимает параметров:

Если класс объявлен открытым, то конструктору по умолчанию неявно присваивается модификатор доступа public;
если класс объявлен защищенным, то конструктору по умолчанию неявно предоставляется модификатор доступа protected;
если класс объявляется private, затем конструктору по умолчанию неявно присваивается модификатор доступа private; в противном случае
конструктор по умолчанию имеет доступ по умолчанию подразумевается модификатор доступа.


- A constructor будет контроль доступа типа default, когда нет модификатор доступа определен явно. Таким образом, этот конструктор будет иметь Уровень Пакета Доступа. Классы, которые определены в этом пакете как класс с этим конструктором по умолчанию, смогут получить к нему доступ, а также классы, которые расширяют этот класс, содержащий конструктор по умолчанию, смогут получить к нему доступ через наследование.

- если конструктор выполнена private, только код в этом классе доступ к этому.

Синглтон пример

public class Test {

  private static Test uniqueInstance = new Test();

  private Test(){}

  public static Test getInstance(){

    return uniqueInstance;

 }


}

- даже нестатические inner classes в классе доступ к своим частным memebers и наоборот.

например:

public class T {


    private T(){

        System.out.println("Hello");
    }

    class TT{

        public TT(){

            new T();
        }
    }

    public static void main(String[] args){

        T t = new T();
        T.TT i = t.new TT();

    }

}

Он отличается в зависимости от того, пишете ли вы конструктор для обычного класса или перечисление:

  • для классов, ответ дан JLS §6.6.1:

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

  • для перечислений ответ дается JLS §8.9.2:

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

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