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