2016-01-31 2 views
-2

Мне было интересно, какая разница между этими двумя сценариями. Может ли кто-то объяснить или быть тем же?Java: конструктор по умолчанию и непараметрированный конструктор

Class MyClass1(){ 
    String property; 
    // has a compiler defined default constructor 
    // MyClass1(){ } 
} 

Vs

Class MyClass2(){ 
    String property; 
    // has a compiler user defined constructor 
    MyClass2(){ } 
} 
+0

OP просит из [этот ответ] (http://stackoverflow.com/a/35117538/3824919) и мой комментарий под ней (просто для того, чтобы обеспечить небольшой контекст для этого вопроса). – Tom

ответ

1

Первый случай (компилятор определен конструктор по умолчанию) имеет место тогда и только тогда, когда нет явных Конструкторов написано. Публично, если сам класс является общедоступным и требует конструктора суперкласса без аргументов (компилятор по умолчанию или явно), который равен public или protected. JLS

Второй вариант с определенным пользователем конструктором позволяет фактически ввести в него код инициализации. Даже если нет параметров, ваш конструктор может все еще хотеть что-то сделать (например, сохранить метку времени, когда объект был создан для поля).

Кроме того, если вы пишете подкласс этому классу, и вы явно не вызываете конструктор суперкласса, вызывается конструктор no-arg super(). Если он не существует, это вызовет ошибку, поэтому вы можете объявить protected MyClass2(){}, чтобы позволить подклассу выполнить этот вызов.

1

Второй пример доступен только для классов в одном пакете (потому что у вас есть значение по умолчанию - или уровень пакета - видимость для конструктора). Конструктор по умолчанию не будет добавлен компилятором, потому что у вас есть явный конструктор. Для них быть эквивалентны, то ему необходимо будет иметь public уровень видимости как

class MyClass3() { 
    String property; 
    public MyClass3() { 
     super(); // <-- implicit before. 
     this.property = null; // <-- also implicit before. 
    } 
} 
Смежные вопросы