Первый случай (компилятор определен конструктор по умолчанию) имеет место тогда и только тогда, когда нет явных Конструкторов написано. Публично, если сам класс является общедоступным и требует конструктора суперкласса без аргументов (компилятор по умолчанию или явно), который равен public
или protected
. JLS
Второй вариант с определенным пользователем конструктором позволяет фактически ввести в него код инициализации. Даже если нет параметров, ваш конструктор может все еще хотеть что-то сделать (например, сохранить метку времени, когда объект был создан для поля).
Кроме того, если вы пишете подкласс этому классу, и вы явно не вызываете конструктор суперкласса, вызывается конструктор no-arg super()
. Если он не существует, это вызовет ошибку, поэтому вы можете объявить protected MyClass2(){}
, чтобы позволить подклассу выполнить этот вызов.
OP просит из [этот ответ] (http://stackoverflow.com/a/35117538/3824919) и мой комментарий под ней (просто для того, чтобы обеспечить небольшой контекст для этого вопроса). – Tom