实际上我无法理解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的测试对象?
时调用此类的默认构造函数答案 0 :(得分:22)
default
构造函数是Java编译器代表您插入的无参数构造函数;它包含default
对super();
的调用(不是supper()
),这是默认行为。如果您实现任何构造函数,则不再接收默认构造函数。
JLS-8.8.9. Default Constructor说(部分),
如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有throws子句的默认构造函数。
如果声明的类是原始类Object,则默认构造函数具有空体。否则,默认构造函数只调用不带参数的超类构造函数。
答案 1 :(得分:7)
default constructor
是Java编译器在没有显式构造函数可用时添加到代码中的构造函数。
默认构造函数调用没有args的超类构造函数。
如果添加了自己的构造函数(无论是没有参数还是参数),编译器在这种情况下都不会添加默认构造函数。
答案 2 :(得分:5)
什么是默认构造函数?
如果您尚未定义构造函数,则它是编译器添加的构造函数。
如果您的类已经有构造函数,那么编译器将不会添加默认构造函数。
所以在你的情况下你有构造函数,
public Test(){
super();
this.setSize(200,200);
this.setVisible(true);
}
因此现在没有JVM调用的默认构造函数。
答案 3 :(得分:2)
答案是否。引用变量cFrame将调用非arg构造函数Test(),而不是默认构造函数。而Test()构造函数将进一步查找并调用JFrame类(Parent)的非arg构造函数,依此类推 每个类必须至少有一个构造函数。如果没有明确声明,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
虽然非arg构造函数仅由程序员定义。它也可以初始化变量。在这里添加的另一点是,如果在派生类中没有找到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
答案 4 :(得分:0)
答案是“否”。如果您在类中编写任何类型的构造函数,Java均不会提供默认构造函数。
它们之间的区别是默认构造函数的主体始终为空,而我们可以在no-arg构造函数中插入自己的代码。
答案 5 :(得分:0)
默认的构造函数就是它的名字,如果我们没有明确创建一个构造函数,那么Java编译器将创建一个默认的构造函数。作为开发人员,如果我们使用0个参数创建自己的构造函数,那么它将是N.o参数构造函数。