Будет ли сгенерированный компилятором конструктор по умолчанию общедоступным?
Когда я пишу класс 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
Если класс не содержит объявлений конструктора, автоматически предоставляется конструктор по умолчанию, который не принимает параметров:
- Если класс объявлен как открытый, то конструктор по умолчанию неявно получает модификатор доступа public;
- Если класс объявлен защищенным, тогда конструктору по умолчанию неявно предоставляется защищенный модификатор доступа;
- Если класс объявлен как приватный, тогда конструктору по умолчанию неявно предоставляется модификатор доступа private;
- В противном случае конструктор по умолчанию имеет доступ по умолчанию, подразумеваемый без модификатора доступа
Это будет public
как видимость класса является публичной
public Widget() {}
Поскольку видимость классов является публичной, она всегда будет публичным конструктором.
Зависит от видимости класса. Для вашего класса конструктор dafault будет общедоступным.
В типе класса, если класс объявлен как открытый, тогда конструктору по умолчанию неявно предоставляется модификатор доступа public (§6.6); если класс объявлен защищенным, тогда конструктору по умолчанию неявно предоставляется защищенный модификатор доступа (§6.6); если класс объявлен как приватный, тогда конструктору по умолчанию неявно предоставляется модификатор доступа private (§6.6); в противном случае конструктор по умолчанию имеет доступ по умолчанию, подразумеваемый без модификатора доступа.
Если ваш класс общедоступен, то конструктор по умолчанию будет общедоступным, так что в вашем случае, поскольку класс Widget общедоступен, его конструктор по умолчанию, предоставляемый компилятором, также будет общедоступным. Видеть это