Подтвердить что ты не робот

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

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

class A {    
  A(int i){    
  }
}

class B extends A {
}

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

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

4b9b3361

Ответ 1

Здесь работают два аспекта:

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

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

    B()
    {
        super();
    }
    

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

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

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

Ответ 2

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

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

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

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().

Ответ 3

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

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

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

class B extends A{
     int i; 
     B(int m){
        i=m;
     }
}

Ответ 4

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

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

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

Ответ 5

Why default constructor is required(explicitly) in a parent class if it 
has an argumented constructor

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

Теперь в вашем классе B

class B extends A {
}

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

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

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

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

ИЛИ

Явно написать конструктор args в B и вызвать ваш супер с каким-либо аргументом по умолчанию.

B()
{
    super(defaultIntValue);
}

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

Ответ 6

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

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

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

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

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

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

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

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

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

Ответ 7

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

class A{
  A(int i){
    System.out.println("A.i= "+i);
  }
}

class B extends A {
  public static void main(String... args) {
    new B();
  }
}

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

Ответ 8

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

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

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

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

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

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

Ответ 9

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

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

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

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

Ответ 10

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

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 */
    }
}

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

Ответ 11

При расширении класса конструктор суперкласса по умолчанию добавляется автоматически.

public class SuperClass {
}

public class SubClass extends SuperClass {
   public SubClass(String s, Product... someProducts) {
      //super(); <-- Java automatically adds the default super constructor
   }
}

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

public class SuperClass {
   public SuperClass(String s, int x) {
     // some code
   }
}

public class SubClass extends SuperClass {
   public SubClass(String s, Product... someProducts) {
      super("some string", 1);
   }
}

ИЛИ ЖЕ...

public class SuperClass {
   public SuperClass() {
     // can be left empty.
   }
}

public class SubClass extends SuperClass {
   public SubClass(String s, Product... someProducts) {
      //super(); <-- Java automatically adds the no-parameter super constructor
   }
}

Ответ 12

Потому что, если вы хотите заблокировать создание объектов без каких-либо данных, это один хороший способ.