Что такое модификатор доступа конструктора по умолчанию в 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.


в дополнение к тому, что Джон довольно хорошо заявил, Вот пример изображения, для визуальных парней.

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

вот пример, который успешно отображает приведенное выше правило:

enter image description here

для получения дополнительной информации, пожалуйста, обратитесь здесь.


Я хотел бы отметить еще одну вещь, которую я недавно получил. Если вы определяете конструктор по умолчанию для своего класса, то это спецификатор acess будет тем, что вы назначаете. Например,

 public class A{
       A(){
       // do some stuff
       }
    }

здесь спецификатором доступа конструктора по умолчанию является package access, а не public access (доступ класса). Однако

 public class A{
       // no constructor is defined
    }

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