我正在努力学习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中创建可选参数的。所以它提出了两个问题:
答案 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 methods和varargs。