Почему конструктор по умолчанию требуется в родительском classе, если он имеет аргумент-редактор?

Почему конструктор по умолчанию требуется (явно) в родительском classе, если он имеет аргументированный конструктор

class A { A(int i){ } } class B extends A { } class Main { public static void main(String a[]){ B b_obj = new B(); } } 

Это будет ошибка.

Здесь есть два аспекта:

  • Если вы явно укажете конструктор (как в A ), компилятор Java не создаст для вас конструктор без параметров.

  • Если вы явно не укажете конструктор (как в B ), компилятор Java создаст для вас конструктор без параметров:

     B() { super(); } 

(Доступность зависит от доступности самого classа.)

Это пытается вызвать конструктор без параметров без надстроек, поэтому он должен существовать. У вас есть два варианта:

  • Предоставить конструктор без параметров в A
  • Внесите конструктор без параметров в явном виде в B который явно вызывает конструктор базового classа с соответствующим аргументом int .

Почему конструктор по умолчанию требуется (явно) в родительском classе, если он имеет аргументированный конструктор

Я бы сказал, что это утверждение не всегда правильно. В идеале его не требуется .

Правило: Если вы явно предоставляете конструктор с аргументом-ed, то конструктор по умолчанию (не аргументированный) недоступен для classа.

 For Example : class A { A(int i){ } } class B extends A { } 

Поэтому, когда вы пишете

 B obj_b = new B(); 

Он на самом деле вызывает неявный конструктор, предоставляемый java для B, который снова вызывает super (), который должен быть идеально A (). Но так как вы предоставили конструктор с аргументами для A, конструктор по умолчанию i: e A () не доступен для B ().

Вот почему вам нужен A (), который будет специально объявлен для B () для вызова super ().

Предполагая, что вы хотели написать class B extends A :

Каждый конструктор должен вызывать конструктор суперclassа; если он не является безцементным конструктором суперclassа, называется неявным.

Если (и только если) class не объявляет конструктор, компилятор Java дает ему конструктор по умолчанию, который не принимает никаких параметров и вызывает беспараметрический конструктор суперclassа. В вашем примере A объявляет конструктор и поэтому не имеет такого конструктора по умолчанию. Класс B не объявляет конструктор, но не может получить конструктор по умолчанию, потому что его суперclass не имеет конструктора без параметров. Поскольку class всегда должен иметь конструктор, это ошибка компилятора.

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

 class B extends A{ B(int m){ super(m); } } 

Но следующее не будет компилироваться, если вы явно не создадите конструктор args в суперclassе:

 class B extends A{ int i; B(int m){ i=m; } } 
 Why default constructor is required(explicitly) in a parent class if it has an argumented constructor 

Не обязательно!

Теперь в вашем classе B

 class B extends A { } 

вы не предоставили никакого конструктора в classе B, поэтому будет установлен конструктор по умолчанию. Теперь это правило, что каждый конструктор должен вызвать один из его суперclass classа. В вашем случае конструктор по умолчанию в classе B попытается вызвать конструктор по умолчанию в classе A (он является родителем), но поскольку у вас нет конструктора по умолчанию в classе A (поскольку вы явно предоставили конструктор с аргументами в classе A, вы будете не имеет конструктора по умолчанию в classе A), вы получите сообщение об ошибке.

Что вы можете сделать, это

Либо не создайте конструктор args в classе A.

 A() { //no arg default constructor in Class A } 

ИЛИ

Явно не создайте конструктор args в B и вызовите ваш super с некоторым аргументом int по умолчанию.

 B() { super(defaultIntValue); } 

Итог заключается в том, что для создания объекта полностью должны быть вызваны конструкторы каждого родителя в иерархии наследования. Какие звонки – это действительно ваш выбор дизайна. Но если вы явно не предоставите какой-либо java, он поместит вызов конструктора super () по умолчанию в качестве первой строки каждого из ваших конструкторов подclassа, и теперь, если у вас нет этого в суперclassе, вы получите сообщение об ошибке.

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

  • Если вы явно определяете конструкторы в любом classе (базовый class / суперclass), компилятор Java не будет создавать для вас какой-либо конструктор в этом соответствующем classе.

  • Если вы явно не определяете конструкторы в любом classе (базовый class / суперclass), компилятор Java создаст для вас конструктор без аргументов в этом соответствующем classе.

  • Если ваш class является базовым classом, наследующим от суперclassа, и вы не явно определяете конструкторы в этом базовом classе, не только создаст конструктор без аргументов для вас (как и выше) компилятором, но он также будет неявно вызывать конструктор без аргументов из суперclassа.

     class A { A() { super(); } } 
  • Теперь, если вы не используете тип expressии super (), (или супер (параметры)), компилятор помещает в super () для вас в ваш код.
  • Если super () вызывается (явно или неявно компилятором), компилятор ожидает, что ваш суперclass будет иметь конструктор без параметров. Если он не найдет конструктора в вашем суперclassе без параметров, он даст вам ошибку компилятора.

  • Similary, если супер (параметры) вызывается, компилятор ожидает, что ваш суперclass будет иметь конструктор с параметрами (количество и тип параметров должны совпадать). Если он не найдет такого конструктора в вашем суперclassе, он даст вам ошибку компилятора. (Супер (параметры) никогда нельзя назвать неявным компилятором. Он должен быть явно помещен в ваш код, если требуется.)

Мы можем суммировать несколько вещей из приведенных выше правил

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

Еще одно замечание: если ваш суперclass имеет частный конструктор, это создаст ошибку при компиляции вашего подclassа. Это потому что, если вы не пишете конструктор в своем подclassе, он вызовет конструктор суперclassа, а неявный super () попытается найти конструктор без аргументов в суперclassе, но не найдет его.

Скажите, что это скомпилировано, что вы ожидаете от печати?

 class A{ A(int i){ System.out.println("Ai= "+i); } } class B extends A { public static void main(String... args) { new B(); } } 

Когда A построено, значение i должно быть передано, однако компилятор не знает, каким он должен быть, поэтому вы явно указываете его в конструкторе (любой конструктор, он не должен быть стандартным)

Конечно, это ошибка, если написано так, что это не JAVA.

Если бы вы использовали синтаксис JAVA, это не было бы ошибкой.

Класс A и B ничего не знают друг о друге, если в отдельных файлах / пакетах.

Класс A не нуждается в конструкторе по умолчанию, он отлично работает только с конструктором параметров.

Если B расширяет A, вы просто используете вызов super (int a) в конструкторе B, и все в порядке. для конструкторов, не вызывающих super (empty / or not), расширяющих суперclass, компилятор добавит вызов super ().

Для дальнейшего чтения посмотрите на Использование ключевого слова super

Я бы предположил, что это потому, что, когда у вас есть пустой список параметров, супер переменная не может быть создана. С пустым списком параметров я подразумеваю неявный супер (), который компилятор мог бы добавить, если суперclass имел непараметрический конструктор.

Например, если вы наберете:

 int a; System.out.print(a); 

Вы получите ошибку с тем, что, по моему мнению, является той же логической ошибкой.

Когда у нас есть конструктор параметров. мы явно привязаны к потребителю по дизайну. он не может создать объект этого classа без параметра. Некоторое время нам нужно заставить пользователя предоставить стоимость. объект должен быть создан только путем предоставления параметра (значение по умолчанию).

 class Asset { private int id; public Asset(int id) { this.id = id; } } class Program { static void Main(string[] args) { /* Gives Error - User can not create object. * Design bound */ Asset asset1 = new Asset();/* Error */ } } 

Даже class ребенка не может создать. следовательно, это поведение хорошего дизайна.

  • Как проверить, является ли строка числовой?
  • Как использовать параметры с HttpPost
  • итерация и удаление с карты
  • Android - динамически получать текущую активность на переднем плане
  • java.lang.NullPointerException: попытка вызвать виртуальный метод для ссылки на нулевой объект
  • В чем разница между ServletContextHandler.setResourceBase и ResourceHandler.setResourceBase при использовании встроенного контейнера Jetty?
  • Таймер Android, обновляющий текстовое представление (UI)
  • Как нарисовать заполненный треугольник в андроидном canvasе?
  • Ошибка MultiDex NoClassDefFound
  • Найдите, если число является степенью двух без функции математики или функции журнала
  • com.android.build.transform.api.TransformException
  • Interesting Posts

    Код ошибки: 1215. Невозможно добавить ограничение внешнего ключа (foreign keys)

    Проблемы с общим доступом к сети между двумя ноутбуками

    Как добавить значок перед каждым элементом в диалоговом окне предупреждения?

    Java -version сообщает о неправильной версии на Mac OSX Mountain Lion

    Сравните два объекта JSON в Java

    Android: я потерял свой магазин ключей для Android, что мне делать?

    как получить html-контент из веб-представления?

    Показать скрытые файлы в OS X, кроме .DS_Store

    Как отображать изображение с помощью загрузочных данных WebView?

    Разработка кросс-платформенного мобильного приложения

    Взаимодействие между формами – Как изменить контроль формы из другой формы?

    Прозрачные изображения с помощью C # WinForms

    Случайный режим отключения, который игнорирует ввод клавиатуры, кроме действий переключения, окна

    чтение строки с пробелами с помощью sscanf

    Нет сгенерированного файла R.java в моем проекте

    Давайте будем гением компьютера.