Java中的无参数构造函数和默认构造函数之间的区别

时间:2014-12-26 07:29:49

标签: java constructor default-constructor

实际上我无法理解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的测试对象?

时调用此类的默认构造函数

6 个答案:

答案 0 :(得分:22)

default构造函数是Java编译器代表您插入的无参数构造函数;它包含defaultsuper();的调用(不是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参数构造函数。