Конструкторы и наследование по умолчанию в Java

У меня вопрос о конструкторах по умолчанию и наследовании на Java.

Как правило, если вы пишете class и не включаете какой-либо конструктор, Java автоматически предоставляет вам конструктор по умолчанию (один без параметров), который инициализирует все переменные экземпляра classа (если они есть) с некоторыми значениями по умолчанию (0, null , или false). Однако, если вы пишете конструктор с некоторыми параметрами и не создаете конструктор по умолчанию, то Java не предоставляет конструктор по умолчанию. Мой вопрос: что происходит с classами, которые наследуются от других classов – если я пишу конструктор с некоторыми параметрами в них, но не включаю конструктор по умолчанию, наследуют ли они конструктор по умолчанию суперclassа?

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

  2. Если какой-либо конструктор явно не вызывает супер или этот конструктор в качестве своего первого оператора, автоматически добавляется вызов super () .

Всегда.

Конструкторы не наследуются.

Кроме того, инициализация полей выполняется виртуальной машиной, а не конструктором по умолчанию. Конструктор по умолчанию просто вызывает конструктор по умолчанию суперclassа, а конструктор по умолчанию Object пуст. Хорошим моментом этого дизайна является отсутствие возможности доступа к неинициализированным полям.

Если вы не используете super (…), конструктор вызывает пустой конструктор своего родителя. Примечание. Это делается на всех ваших classах, даже тех, которые расширяют Object.

Это не наследует, подclassы не получают одинаковые конструкторы с теми же аргументами. Однако вы можете добавить конструкторы, которые вызывают один из конструкторов суперclassа.

Основным правилом является вызов (или вызов) в конструктор, который должен быть первым оператором, который должен выполнить JVM,

Поэтому, когда у вас есть суперclass с только параметризованным конструктором и конструктором по умолчанию, а базовый class не имеет явного вызова параметризованного конструктора суперclassа, JVM предоставляет super (); вызов, который вызывает ошибку, поскольку для суперclassа не существует конструктора по умолчанию, поэтому либо мы предоставляем конструктор по умолчанию в суперclassе, либо явным образом вызываем конструктор с параметризацией суперclassа в конструкторе базового classа. когда мы даем явный вызов, тогда JVM не утруждает себя строкой super (); поскольку вызов конструктора должен быть первым утверждением метода, которого не может произойти (из-за нашего явного вызова).

В разделе 8.8.9 Спецификации языка Java подробно объясняется, что происходит:

Если class не содержит объявлений конструктора, то конструктор по умолчанию объявляется неявно. Форма конструктора по умолчанию для classа верхнего уровня, classа-члена или локального classа выглядит следующим образом:

  • Конструктор по умолчанию имеет такую ​​же доступность, как и class (§6.6).
  • Конструктор по умолчанию не имеет формальных параметров, за исключением неширокого внутреннего classа-члена, где конструктор по умолчанию неявно объявляет один формальный параметр, представляющий непосредственно входящий экземпляр classа (§8.8.1, §15.9.2, §15.9.3 ).
  • Конструктор по умолчанию не имеет предложений бросков.
  • Если объявляемый class является искомым объектом classа, то конструктор по умолчанию имеет пустое тело. В противном случае конструктор по умолчанию просто вызывает конструктор суперclassа без аргументов.

Вы можете видеть, что здесь нет наследования: все, что есть, это «магия компилятора» с неявным объявлением конструктора по умолчанию. Спецификация также дает понять, что конструктор по умолчанию добавляется только тогда, когда class не имеет никаких конструкторов вообще, что означает, что ответ на ваш вопрос «нет»: после предоставления classа конструктору доступ к конструктору по умолчанию его суперclass потерян.

Если вы предоставите конструктор, то Java не будет генерировать пустой конструктор по умолчанию. Таким образом, ваш производный class сможет вызывать только ваш конструктор.

Конструктор по умолчанию не инициализирует ваши частные переменные значениям по умолчанию. Доказательство того, что можно написать class, у которого нет конструктора по умолчанию, и его частные члены инициализируются значениями по умолчанию. Вот пример:

 public class Test { public String s; public int i; public Test(String s, int i) { this.s = s; this.i = i; } public Test(boolean b) { // Empty on purpose! } public String toString() { return "Test (s = " + this.s + ", i = " + this.i + ")"; } public static void main (String [] args) { Test test_empty = new Test(true); Test test_full = new Test("string", 42); System.out.println("Test empty:" + test_empty); System.out.println("Test full:" + test_full); } } 

Правило Thumb – это то, что Sub Class должен вызывать любой конструктор из базового classа. поэтому, если у вас нет значения по умолчанию, вызовите существующий из подclassа. другой мудрый реализует пустой const в базовом classе, чтобы избежать проблемы с компиляцией

Ответ на ваш вопрос очень прост. Implicitly (Invisible), первый оператор в любом конструкторе – ‘super ();’ т.е. вызов суперкомпьютера без конструктора параметров, пока вы явно не измените его на нечто вроде «this ();», «this (int)», «this (String)», «super (int)», «super (String) ) ‘и т. д.’ this (); ‘ является конструктором текущего classа.

Когда мы не создаем конструктор, Java автоматически создает конструктор по умолчанию. Но когда мы создаем один или несколько настраиваемых конструкторов с аргументами, Java не создает конструкторы по умолчанию. Если мы создаем один или несколько конструкторов и хотим создать объект без каких-либо аргументов конструктора, мы должны объявить пустой конструктор.

Будет ошибка времени компиляции … потому что компилятор ищет по умолчанию конструктор он суперclass и если его не там … его ошибка … и программа не будет компилировать …

  • Объявление примитивов / объектов, значения инициализации по умолчанию
  • Каков пакет по умолчанию, в который помещаются мои classы, если я не укажу его?
  • Почему компилятор Scala запрещает перегруженные методы с аргументами по умолчанию?
  • Почему «final» не допускается в методах интерфейса Java 8?
  • Как открыть браузер по умолчанию в C #
  • Интерфейс с методами по умолчанию vs Абстрактный class в Java 8
  • Программный эквивалент по умолчанию (Тип)
  • Force R не использовать экспоненциальную нотацию (например, e + 10)?
  • Поддерживает ли Java значения параметров по умолчанию?
  • Можете ли вы вызвать метод по умолчанию родительского интерфейса из интерфейса, который подclassифицирует этот интерфейс?
  • Почему в параметрах C ++ последнее значение должно быть добавлено последними?
  • Давайте будем гением компьютера.