Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

- Если конструктор создан private, то доступ к этому может получить только код внутри этого класса.

Пример Singleton

public class Test {

  private static Test uniqueInstance = new Test();

  private Test(){}

  public static Test getInstance(){

    return uniqueInstance;

 }


}

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

Например:

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();

    }

}

Ответ 4

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

  • Для классов ответ предоставляется JLS §6.6.1:

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

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

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

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