我是学生。刚刚回到家庭作业,说明我应该调用构造函数方法,而不是重用相同的代码。我复制了代码,因为我无法在没有错误的情况下调用构造函数。从单独的方法调用构造函数方法的正确语法是什么?
我确实做过搜索,但我找不到这个特定的(在课堂内)问题。我确实尝试过使用“this”以及创建类实例,但我一直都会遇到错误。
import java.util.Random;
public class Coin {
// variable for a generic coin toss
private String sideUp;
// Constructor
// ******************** Instructor notes...
// This is the same code as your toss() method
// It is OK to call that method from your constructor.
// Don't copy/paste code or repeat yourself if not required.
public Coin() {
Random rand1 = new Random();
int x = rand1.nextInt(2);
if (x > 0){
sideUp = "Heads";
}else{
sideUp = "Tails";
}
}
//Void Method
public void toss() {
// how to call the Coin constructor above??????????????????????????
Coin();
}
}
答案 0 :(得分:2)
反过来做。将代码移回toss方法,只需从构造函数内部调用toss()
。
import java.util.Random;
public class Coin {
// variable for a generic coin toss
private String sideUp;
// Constructor
// ******************** Instructor notes...
// This is the same code as your toss() method
// It is OK to call that method from your constructor.
// Don't copy/paste code or repeat yourself if not required.
public Coin() {
toss();
}
//Void Method
public final void toss() {
Random rand1 = new Random();
int x = rand1.nextInt(2);
if (x > 0){
sideUp = "Heads";
}else{
sideUp = "Tails";
}
}
}
正如其他评论和答案中所指出的,调用可能从构造函数覆盖的方法是一个坏主意。以下是对原因的一个很好的解释:Why is it considered bad practice to call a method from within a constructor?
您可以像我在这里一样制作方法final
,以避免出现问题。
答案 1 :(得分:1)
要使用构造函数,您需要使用'new'关键字。 e.g。
Coin myCoin = new Coin();
答案 2 :(得分:1)
// ******************** Instructor notes... // This is the same code as your toss() method // It is OK to call that method from your constructor.
我担心第三种说法不是真的。在构造函数中调用可覆盖的方法实际上是不行的。这将在对象完全初始化之前泄漏this
引用。 That could give you unexpected result,如果在子类中覆盖您的方法。您应该与导师确认一下。
toss()
方法,如果该部分代码必须是toss()
方法的一部分。
或者如果你真的想要在构造函数和toss()
方法中执行这些代码,那么在你的类中创建一个private
方法,在那里移动那些代码,并从两个地方调用它:
public class Coin {
// variable for a generic coin toss
private String sideUp;
public Coin() {
initSideUp();
}
//Void Method
public void toss() {
initSideUp();
}
private void initSideUp() {
Random rand1 = new Random();
int x = rand1.nextInt(2);
if (x > 0){
sideUp = "Heads";
}else{
sideUp = "Tails";
}
}
}