如何在对象中调用方法而不传递应该在对象中已经存在的变量?

How do I call a method in an object without passing a variable that should already be in the object?

提问人:HermitIX 提问时间:5/31/2023 更新时间:5/31/2023 访问量:43

问:

我正在尝试创建一个掷骰子程序来练习编写程序。我正在创建一个 Dice 对象。我希望能够创建一个骰子,并在创建它时说明边数。示例:骰子 d6 = new Dice(6)。之后,我希望能够打印出卷筒结果,而无需指定边数。在通话中。现在我有这个......System.out.println(d6.rollDie(6));。我希望能够只做System.out.println(d6.rollDie);或者 System.out.println(d6.rollDie());每次调用时都必须指定边数,这否定了在对象中具有边变量的意义。

这是我当前的 Java 代码。

//Main.java
public class Main {

    public static void main(String[] args) {
    
        Dice d6 = new Dice(6);
        System.out.println(d6.sides);
        System.out.println(d6.rollDie(6));
    }

}


//Dice.java
import java.util.Random;

public class Dice {
    int sides;
    int roll;

    Dice(int sides) {
        this.sides = sides;
    }


    public int rollDie(int sides) {
        this.sides = sides;
        Random random = new Random();
        int result = random.nextInt(sides + 1) + 1;
    
        return result;
    }

}
Java Object Random Methods 构造函数

评论

1赞 MadProgrammer 5/31/2023
既然你传递给构造函数,那有什么意义呢?sidespublic int rollDie(int sides) {

答:

1赞 aled 5/31/2023 #1

使用构造函数中已配置的边。只需添加一个调用原始 rollDie() 的方法,并将其作为参数:

public int rollDie() {
        return rollDie(sides);
}
-1赞 Reilas 5/31/2023 #2

方法不需要参数。
定义方法(Java 教程>学习 Java™ 语言>类和对象)。

您可以从类方法 rollDie 中访问您的类字段 sides

public int rollDie()

此外,还可以使用备用 Random#nextInt 方法,该方法具有下限和上限的参数。

int result = random.nextInt(1, sides + 1);

此外,如果每个实例要多次调用此方法,则可以增加本地 Random 声明的范围,并将其作为字段放置。

总而言之,您的班级如下。

public class Dice {
    int sides;
    int roll;
    Random random = new Random();
    
    Dice(int sides) {
        this.sides = sides;
    }

    public int rollDie() {
        return random.nextInt(1, sides + 1);
    }
}
1赞 Elliott Frisch 5/31/2023 #3

它似乎不应该接受争论。至少对于实例方法不是。另外,我推荐 ThreadLocalRandom。而且我很确定您当前的实现有一个偏离一的问题(您有一个七面骰子,而不是六面骰子)。把这些放在一起,可能看起来像rollDie

public class Dice {
    private int sides;

    public Dice(int sides) {
        this.sides = sides;
    }

    public static int rollDie(int sides) {
        return 1 + ThreadLocalRandom.current().nextInt(sides);
    }

    public int rollDie() {
        return 1 + ThreadLocalRandom.current().nextInt(this.sides);
    }
}

评论

0赞 Reilas 5/31/2023
您可以使用继承的 nextInt 来减少 。1 +
1赞 Elliott Frisch 5/31/2023
@Reilas 上限独占。所以这只是移动第二个.1 +
0赞 Reilas 5/31/2023
我不是说步骤。我只是说有一种方法可以处理下限和上限。请注意,到您的答案。