[英]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中创建可选参数。 因此它提出了两个问题:
实体类必须具有无参数的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.