繁体   English   中英

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

[英]Java EE 6 - Why do I need default constructor and how to define optional parameters?

我正在尝试学习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. 如何创建可选参数?

实体类必须具有无参数的public或protected构造函数。

您需要无参数构造函数的另一种情况是当您有子类时。

例如,


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 
   }
 }

默认情况下,它尝试调用超类的无参数构造函数。 因此,除非您有一个明确的super(arg)调用,否则您将需要一个:


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

注意:记住一个简单的Java规则,默认情况下会提供no-arg构造函数,只要您没有另一个带参数的构造函数即可。

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

但是当你写的时候

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

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

您不需要“需要”默认构造函数。 但是,NetBeans对您有所帮助,并通知您您需要一个,因为它假定您正在创建一个Bean-要求创建该选项而无需构造函数需要参数-因为调用代码不知道要填充的内容这些。

对于“可选”参数,可以定义所需数量的构造函数-每个构造函数都忽略一个或多个“可选”参数。

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

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

如何创建可选参数?

如果要使用更多的参数作为构造函数,则需要在参数中使用... 例如:

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");
    }
}

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

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

但是,如果要创建JPA实体 (因此类的顶部有@Entity ,则需要默认构造函数,因为这是JPA的要求
这是因为从数据库中获取类的实例是由JPA提供程序创建的。 JPA提供者必须有一种实例化您的实体的方法。
如果您只有参数化的构造函数-JPA如何知道应该传递哪些参数?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM