其实我不明白无参构造函数和默认构造函数有什么区别。
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 的测试对象时是否会调用此类的默认构造函数?
default
构造函数是 Java 编译器代表您插入的无参数构造函数;它包含对 default
(不是 super();
)的 supper()
调用,这是默认行为。如果您实现任何构造函数,那么您将不再收到默认构造函数。
JLS-8.8.9。默认构造函数(部分)说,
如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有 throws 子句的默认构造函数。
如果声明的类是原始类 Object,则默认构造函数的主体为空。否则,默认构造函数只是调用不带参数的超类构造函数。
default constructor
是一个构造函数,如果没有显式构造函数可用,Java 编译器会将其添加到代码中。
默认构造函数调用不带参数的超类构造函数。
如果你添加了自己的构造函数(无论是无参还是带参),这种情况下编译器都不会添加默认的构造函数。
什么是默认构造函数?
它是一个构造函数,如果你没有定义构造函数,编译器会添加它。
如果你的类已经有构造函数,那么编译器将不会添加默认构造函数。
所以在你的情况下你有构造函数,
public Test(){
super();
this.setSize(200,200);
this.setVisible(true);
}
因此现在 JVM 没有调用默认构造函数。
答案是否定的。引用变量 cFrame 将调用无参构造函数 Test(),而不是默认构造函数。而 Test() 构造函数将进一步查找并调用 JFrame 类(Parent)的无参数构造函数等等 每个类必须至少有一个构造函数。如果没有显式声明,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(),super() 调用是由 java 编译器自动添加的。
例如:
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
默认构造函数如其名称,如果我们不显式创建构造函数,那么java编译器将创建一个默认构造函数。作为一名开发人员,如果我们创建自己的带有 0 个参数的构造函数,那么它将是无参数构造函数。
Java 中“默认构造函数”和“无参构造函数”的概念很容易混淆。原因是默认构造函数是一种特殊类型的无参数构造函数。但是,并非所有无参构造函数都是默认构造函数。
如果类的源代码中出现any构造函数,即使是空的无参构造函数,也不会生成默认构造函数并且不存在。因为
Test
声明了一个构造函数,但它没有默认构造函数,因此 Test cFrame = new Test();
不会调用默认构造函数。
这两个类在行为方面是相同的(两者都有一个不执行任何操作的无参构造函数),但一个有默认构造函数,而另一个则没有。
class NoDefaultConstructor {
NoDefaultConstructor() {
// This is a no-argument constructor with an empty body, but is not a default constructor.
}
}
class HasDefaultConstructor {
// This class has no declared constructors, so the compiler inserts a default constructor.
}
在每种情况下,您都可以使用
new NoDefaultConstructor()
或 new HasDefaultConstructor()
创建实例,因为这两个类都有 无参构造函数,但只有 HasDefaultConstructor
的无参构造函数是 默认 构造函数。
样式注释:如果构造函数未通过调用
super(...)
或 this(...)
显式链接到另一个构造函数,则会自动在构造函数的开头插入对 super()
的调用。您永远不需要在Java构造函数中编写super()
。这样做会增加视觉噪音,而且是不必要的。
你的问题的答案是“否”。如果你在类中编写任何类型的构造函数,Java 将不会提供默认构造函数。
它们之间的一个区别是默认构造函数的主体始终为空,而我们可以在无参数构造函数中插入我们自己的代码。
默认构造函数继承类的访问修饰符,这意味着如果一个类是公共的,那么默认构造函数必须是公共的。 另一方面,无参数构造函数的访问修饰符可以是 public、private、protected 和 default。