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的Test对象时调用此类的默认构造函数?

default构造函数是Java编译器代表您插入的无参数构造函数; 它包含对super();default调用super(); (不是supper() )这是默认行为。 如果您实现任何构造函数,那么您不再接收默认构造函数。

JLS-8.8.9。 默认构造函数说(部分),

如果类不包含构造函数声明,则隐式声明没有forms参数且没有throws子句的默认构造函数。

如果声明的类是原始类Object,则默认构造函数具有空体。 否则,默认构造函数只调用不带参数的超类构造函数。

default constructor是Java编译器在没有显式构造函数可用时添加到代码中的构造函数。 默认构造函数调用没有args的超类构造函数。

如果添加了自己的构造函数(无论是没有参数还是带参数),编译器在这种情况下都不会添加默认构造函数。

什么是默认构造函数?

如果您尚未定义构造函数,则它是由编译器添加的构造函数。

如果您的类已经有构造函数,那么编译器将不会添加默认构造函数。

所以在你的情况下你有构造函数,

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

因此,现在没有JVM调用的默认构造函数。

答案是否。引用变量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