Будет ли сгенерированный компилятором конструктор по умолчанию общедоступным?

Когда я пишу класс Widget.java

public class Widget {
    int data;
    String name;
}

будет ли сгенерированный компилятором конструктор общедоступным или по умолчанию?

публика будет как

public class Widget {
    int data;
    String name;
    public Widget() {}
}

тогда как по умолчанию похоже на

public class Widget {
    int data;
    String name;
    Widget() {}
}

7 ответов

Решение

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

Как сказано в JLS

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

  1. Если класс объявлен как открытый, то конструктор по умолчанию неявно получает модификатор доступа public;
  2. Если класс объявлен защищенным, тогда конструктору по умолчанию неявно предоставляется защищенный модификатор доступа;
  3. Если класс объявлен как приватный, тогда конструктору по умолчанию неявно предоставляется модификатор доступа private;
  4. В противном случае конструктор по умолчанию имеет доступ по умолчанию, подразумеваемый без модификатора доступа

Это будет public как видимость класса является публичной

public Widget() {}

Это будет публичный виджет () {}

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

Зависит от видимости класса. Для вашего класса конструктор dafault будет общедоступным.

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

Отсюда

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

Другие вопросы по тегам