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

问题描述 投票:0回答:8

其实我不明白无参构造函数和默认构造函数有什么区别。

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 的测试对象时是否会调用此类的默认构造函数?

java constructor default-constructor
8个回答
31
投票

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

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

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

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


8
投票

default constructor
是一个构造函数,如果没有显式构造函数可用,Java 编译器会将其添加到代码中。 默认构造函数调用不带参数的超类构造函数。

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


5
投票

什么是默认构造函数?

它是一个构造函数,如果你没有定义构造函数,编译器会添加它。

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

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

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

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


2
投票

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

1
投票

默认构造函数如其名称,如果我们不显式创建构造函数,那么java编译器将创建一个默认构造函数。作为一名开发人员,如果我们创建自己的带有 0 个参数的构造函数,那么它将是无参数构造函数。


1
投票

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()
。这样做会增加视觉噪音,而且是不必要的。


0
投票

你的问题的答案是“否”。如果你在类中编写任何类型的构造函数,Java 将不会提供默认构造函数。

它们之间的一个区别是默认构造函数的主体始终为空,而我们可以在无参数构造函数中插入我们自己的代码。


0
投票

默认构造函数继承类的访问修饰符,这意味着如果一个类是公共的,那么默认构造函数必须是公共的。 另一方面,无参数构造函数的访问修饰符可以是 public、private、protected 和 default。

© www.soinside.com 2019 - 2024. All rights reserved.