Что такое модификатор доступа конструктора по умолчанию в java?
мы все знаем, что если мы специально не определяем конструктор, компилятор вставляет невидимый конструктор нулевого параметра. Я думал, что его модификатор доступа был публичным, но, имея дело с проблемой внутреннего класса, я обнаружил, что, возможно, я ошибался. Вот мой код:
public class Outer {
protected class ProtectedInner {
// adding a public constructor will solve the error in SubOuterInAnotherPackage class
//public ProtectedInner() {}
}
}
и есть подкласс Outer
в другой пакет:
public class SubOuterInAnotherPackage extends Outer {
public static void main(String[] args) {
SubOuterInAnotherPackage.ProtectedInner protectedInner
= new SubOuterInAnotherPackage().new ProtectedInner(); // Error!! Can't access the default constructor
}
}
вы получите ошибку в main()
метод, но если вы добавите открытый конструктор в ProtectedInner
класс, что ошибка разрешенный. Вот почему я думаю, что модификатор конструктора по умолчанию не является общедоступным! Так может кто-нибудь сказать мне, что модификаторы доступа конструктора по умолчанию?
3 ответов
Я думал, что его модификатор доступа является общедоступным, но когда я имею дело с проблемой внутреннего класса, я обнаружил, что, возможно, я ошибался.
Юп. Действительно, пару лет назад я оказался в такой же ситуации. Я был удивлен ошибкой (через инъекцию Guice, что сделало ее немного сложнее найти).
ключ должен проверить спецификацию, в этом случае 8.8.9:
в типе класса, если класс объявлен открытым, то конструктору по умолчанию неявно присваивается модификатор доступа public (§6.6); если класс объявлен защищенным, то конструктору по умолчанию неявно присваивается модификатор доступа protected (§6.6); если класс объявлен закрытым, то конструктору по умолчанию неявно присваивается модификатор доступа private (§6.6); в противном случае конструктор по умолчанию имеет доступ по умолчанию, подразумеваемый модификатором доступа no.
в этом случае, ваш конструктор неявно protected
.
в дополнение к тому, что Джон довольно хорошо заявил, Вот пример изображения, для визуальных парней.
Если в классе нет конструктора, компилятор автоматически создает конструктор по умолчанию.
вот пример, который успешно отображает приведенное выше правило:
для получения дополнительной информации, пожалуйста, обратитесь здесь.
Я хотел бы отметить еще одну вещь, которую я недавно получил. Если вы определяете конструктор по умолчанию для своего класса, то это спецификатор acess будет тем, что вы назначаете. Например,
public class A{
A(){
// do some stuff
}
}
здесь спецификатором доступа конструктора по умолчанию является package access, а не public access (доступ класса). Однако
public class A{
// no constructor is defined
}
здесь компилятор будет сочувствовать вам и даст вам конструктор по умолчанию, спецификатор доступа которого будет таким же, как класс, который является публичным.