Разница между конструктором no-arg и конструктором по умолчанию в Java

На самом деле я не могу понять, в чем разница между конструктором no-arg и конструктором по умолчанию.

import javax.swing.*;

public class Test extends JFrame {
   public Test() {
     super();
     this.setSize(200,200);
     this.setVisible(true);
   }
   public static void main(Sting[] arg) {
       Test cFrame = new Test();
   }
}

Это вызывает конструктор по умолчанию этого класса при создании объекта Test cFrame?

Ответы

Ответ 1

Конструктор default - это конструктор no-args, который компилятор Java вставляет от вашего имени; он содержит вызов default для super(); (not supper()), который является поведением по умолчанию. Если вы реализуете какой-либо конструктор, вы больше не получаете конструктор по умолчанию.

JLS-8.8.9. Конструктор по умолчанию говорит (частично),

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

Если объявляемый класс является искомым классом Object, то конструктор по умолчанию имеет пустое тело. В противном случае конструктор по умолчанию просто вызывает конструктор суперкласса без аргументов.

Ответ 2

default constructor - это конструктор, который компилятор Java добавляет к вашему коду, если явный конструктор недоступен. Конструктор по умолчанию вызывает конструктор суперкласса без аргументов.

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

Ответ 3

Что такое конструктор по умолчанию?

Это конструктор, который добавляется компилятором, если вы не определили конструктор.

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

Итак, в вашем случае у вас есть конструктор,

public Test(){
     super();
     this.setSize(200,200);
     this.setVisible(true);
   }

Таким образом, JVM не запускается конструктор по умолчанию.

Ответ 4

Ответ № Нет. Справочная переменная cFrame вызовет конструктор-конструктор non-arg Test(), а не конструктор по умолчанию. В то время как конструктор Test() найдет и вызовет конструктор без аргумента класса JFrame (родительский) и т.д. Каждый класс должен иметь хотя бы один конструктор. Если явно не указано, java-компилятор предоставляет непараметрированный конструктор, т.е. Конструктор по умолчанию. Этот конструктор по умолчанию вызывает непараметрированный конструктор родительских классов. Он инициализирует переменные класса по умолчанию.

Например:

Class Base {}

Class Derived extends Base {} // Default constructor of class "Derived" will automatically calls non-arg constructor of class "Base" and intialzes value to the variables

В то время как конструктор без аргумента определяется только программистом. Он также может инициализировать переменные. Еще один момент для добавления здесь - то, что вызов super() автоматически добавляется компилятором java, если не находит super() в производном классе.

Например:

Class Base {

int y;
    public Base() {
    }
    public int getY() {
    return y;
    }

}

public class Derived extends Base {
 private int x;

 public Derived() { //super() will be automatically used
 }

 public int getX() {
 return x;
 }

 public void setX(int x) {
 this.x = x;
 }
}

Derived d = new Derived();
 System.out.println("Base x value => " + d.getX());

System.out.println("Base y value => " + d.getY());

Result:

Base x value => 0 // Default value to its primitive datatype(In this case: int)

Base y value => 0