我是一名python程序员,但最近开始使用Java。我试图理解一段特定的代码,但遇到了一些困难,我认为这些困难与不太了解Java有关。
对我来说突出的一点是,有时在类定义方法中会调用两次。我想知道为什么会这样?例如:
以下代码取自名为ApplicationCreator.java的文件。我注意到公共类ApplicationCreator本质上实例化了两次,或者我在这里遗漏了什么?
public class ApplicationCreator<MR> implements
IResourceObjectCreator<BinaryRuleSet<MR>> {
private String type;
public ApplicationCreator() {
this("rule.application");
}
public ApplicationCreator(String type) {
this.type = type;
}
所以我的问题在这里:
1)为什么类会在类中实例化?
2)为什么会这样做两次?或者这是将ApplicationCreator类的某些参数设置为新值的方法吗?
任何建议都将受到高度赞赏。
答案 0 :(得分:4)
它没有在类中实例化,它在类中调用了不同的构造函数。
这些是重载的构造函数。构造函数在某种程度上类似于方法,但它们在对象创建时被调用。考虑一下:
public class Example {
private int instanceVariable;
public Example() { //a constructor of Example
instanceVariable = 3;
System.out.println("New Example object was created!");
}
public static void main(String[] args) {
Example ex = new Example();
}
}
这里,我们有一个Example
类,它有一个构造函数。如果您查看main
方法,我们会创建Example
的新实例。程序将输出New Example object was created!
并将实例instanceVariable
设置为3,因为构造函数会立即在对象上调用,因为它构造了对象(因此名称)。
现在,如果你看看你的情况,构造函数有不同的参数(以及签名),因此可以通过不提供参数或提供String来构造对象。让我举例说明这一点:
public ApplicationCreator() {
this("rule.application");
}
this
在这种情况下引用类,并且调用this(args)
调用类的构造函数。由于我们重载了构造函数,Java将调用与传递的参数最匹配的构造函数。因为,在这种情况下,传递一个String,Java将看到构造函数public ApplicationCreator(String)
是最匹配的并将调用它。
在无参数构造函数中,它使用String rule.application
调用另一个构造函数,因此您可以将无参数构造函数视为将构造函数传递给String的默认值。
答案 1 :(得分:2)
1)为什么类会在类中实例化?
该类不会调用自身,它为其他人提供了实例化其对象的方法。阅读constructor。
2)为什么会这样做两次?或者这是将ApplicationCreator类的某些参数设置为新值的方法吗?
构造函数中的正如我所说,这是一种创造物体的方法。第一个将为类型指定默认值。第二个将为其他人提供分配值的选项。阅读constructor overloading。
this
将根据传递给this的参数类型调用同一个类的另一个构造函数。
答案 2 :(得分:2)
这是两种不同的构造者。
它们被称为“不同的签名。”
使用它,你可以用两种不同的方式构造一个ApplicationCreator
对象:
ApplicationCreator ac = new ApplicationCreator();
或
ApplicationCreator ac = new ApplicationCreator("A String");
如需进一步阅读,请参阅:The Java Class Constructor
答案 3 :(得分:1)
该类实际上并没有两次实例化。相反,默认构造函数ApplicationCreator()
(即不带参数的构造函数)只是调用接受输入字符串的构造函数。
这可确保ApplicationCreator
对象始终具有类型。如果未指定类型,则将使用默认值rule.application
。
这是重载构造函数的一个示例。
答案 4 :(得分:0)
它被称为构造函数。并且它不会被叫两次&#34;,只需通过this()
使用给定的参数重定向到另一个。
基本上第一种方式,没有参数,只有一个默认值。否则,您使用给定的String type
答案 5 :(得分:0)
这里这个类有两个构造函数。
当课程名称&#34;方法&#34;名称相同你可以理解那些是构造函数。
这里构造函数超载。基于参数类将被实例化。用户可以根据需要进行选择。