Java EE 6 - 为什么我需要默认构造函数以及如何定义可选参数?

时间:2011-12-05 03:57:19

标签: java

我正在努力学习Java,我已经完成了所有设置,而且我正在运行。我为我的第一个模型创建了一个构造函数,然后设置了一个接受参数的构造函数。我添加了这个功能:

public Guest(String name) {
    this.name = name;
    this.signingDate = new Date(System.currentTimeMillis());
}

Netbeans抛出错误说我需要一个默认构造函数。当我将其更改为:

时,错误消失了
public Guest() {
}

public Guest(String name) {
    this.name = name;
    this.signingDate = new Date(System.currentTimeMillis());
}

我无法想象这是如何在Java中创建可选参数的。所以它提出了两个问题:

  1. 为什么我需要默认构造函数?
  2. 如何创建可选参数?

5 个答案:

答案 0 :(得分:2)

实体类必须具有无参数的公共或受保护的构造函数。

答案 1 :(得分:2)

另一种需要no-arg constrcutors的场景是你有子类。

例如,


class Car {

 Engine engine;
 Car(Engine e)
   {
     // do something
   }

 }

你有一个子类,


class Benz extends Car
 {
   Benz()
   { 
   }
 }

现在您无法实例化Benz对象。原因是,在调度new Benz()实例化时,首先调用父构造函数。

即,


class Benz extends Car
 {
   Benz()
   {
     super(); //implicitly added 
   }
 }

默认情况下,它尝试调用超类的无参数构造函数。所以你需要一个,除非你有一个明确的超级(arg)调用:


class Benz extends Car
 {
   Benz()
   {
     super(new Engine()); 
   }
 }

注意:要记住的简单Java规则 默认情况下,只要您没有带参数的其他构造函数,就会提供无参数构造函数。

 class Car{} 
相当于
class Car{ Car() }

但是当你写作时,

 class Car{ Car(Engine e){} }
默认情况下没有提供no-arg构造函数。如果需要,您必须明确编码
 class Car{ Car(){} Car(Engine e)} 

答案 2 :(得分:1)

是。 Java支持方法/构造函数重载。

您不需要“默认构造函数”。但是,NetBeans对您有所帮助,并告知您需要一个,因为它假定您正在创建一个bean - 这需要在没有构造函数需要参数的情况下创建选项 - 因为调用代码不知道要填充什么这些

对于“可选”参数,您可以根据需要定义任意数量的构造函数 - 每个构造函数省略一个或多个“可选”参数。

答案 3 :(得分:1)

  

为什么我需要默认构造函数?

我认为您正在尝试调用new Guest()并且在Guest类中只有一个构造函数Guest(String arg)。这就是为什么它显示错误,你需要创建一个没有参数的构造函数,这是一个类的默认构造函数。

  

如何创建可选参数?

如果要创建一个包含0个以上参数的构造函数,则需要在参数中使用...。 例如:

public class Testing {
    public Testing(String... str) {
    }
    public static void main(String[] args) {
        Testing testing = new Testing();
        Testing testing1 = new Testing("1");
        Testing testing2 = new Testing("2","1");
    }
}

答案 4 :(得分:1)

如果您使用的是POJO(普通旧Java对象),那么只有在通过调用Guest g = new Guest()等无参数构造函数创建此对象的实例时才需要默认构造函数。
这很明显 - 你想使用无参数构造函数 - 你需要有一个。

如果未指定任何构造函数,编译器将为您生成一个(默认的,无参数)。如果你自己指定至少一个构造函数 - 编译器将不会生成任何构造函数,因为它假定你知道你正在做什么。

但是,如果您正在创建 JPA实体(因此您的类顶部有@Entity)而不是需要默认构造函数,因为它是 JPA要求即可。
这是因为当您从数据库中获取类时,JPA提供程序会创建类的实例。 JPA提供程序必须有一种方法来实例化您的实体 如果你只有参数化的构造函数 - JPA如何知道它应该传递什么参数?

Java中没有可选参数,例如PHP世界中您可以定义myMethod($var1, $var2 = null, $var3 = 2);。在Java世界中,我们使用overloaded methodsvarargs