Разница между конструктором 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();
   }
}

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

4 ответов


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

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

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

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


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

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


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

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

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

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

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

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


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

например:

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

в то время как конструктор non-arg определяется только программистом. Он также может intializes переменные. Еще один момент для добавления здесь заключается в том, что вызов 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