在方法中对变量所做的更改未在主方法JAVA中更改

时间:2019-02-22 11:28:24

标签: java methods

首先我要对Java刚起步,我在python方面有相当的经验,但是Java对我来说还很新。

我的问题是我创建了一种方法来确保4个随机数彼此唯一,我只是通过使用while循环比较每种可能的组合来做到这一点。

我可以看到我的代码有效

public static void EqualValues(int num1, int num2, int num3, int num4) {
    Random ran = new Random();
    while(num1 == num2 || num1 == num3 || num1 == num4) {
        num1 = ran.nextInt(9);
        num1 += 1;
    }
    while(num2 == num1 || num2 == num3 || num2 == num4) {
        num2 = ran.nextInt(9);
        num2 += 1;
    }

    while(num3 == num1 || num3 == num2 || num3 == num4) {
        num3 = ran.nextInt(9);
        num3 += 1;
    }
    while (num4 == num1 || num4 == num2 || num4 == num3) {
        num4 = ran.nextInt(9);
        num4 += 1;
    }

    System.out.println(num1);
    System.out.println(num2);
    System.out.println(num3);
    System.out.println(num4);
    System.out.println(".........");
}

哪个将输出4个唯一数字,即: 2 6 8 4

但是,当我在主要方法中执行相同操作时:

public static void main(String[] args) {

    Random ran = new Random();

    int num1 = ran.nextInt(9);
    int num2 = ran.nextInt(9);
    int num3 = ran.nextInt(9);
    int num4 = ran.nextInt(9);

    num1 += 1;
    num2 += 1;
    num3 += 1;
    num4 += 1;

    EqualValues(num1, num2, num3, num4);

    System.out.println(num1);
    System.out.println(num2);
    System.out.println(num3);
    System.out.println(num4);
}

在检查之前,我得到的似乎是四个原始数字,即: 2 6 4 4

如果有人可以指出我错了。我希望我已经描述了我的问题,所以它很容易理解。

1 个答案:

答案 0 :(得分:0)

将发生以下情况:当将变量传递给EqualValues(为了遵循约定,应将其重命名为equalValues)时,它实际上会收到它们的“副本”,并且无法修改。有两种解决方法:

1-您可能以数组形式返回修改后的值。

2-您不传递任何参数,而是将变量声明为静态变量,然后让该方法直接访问它们。

但是,我将总共提出另一种方法:将Set对象传递给您的方法。这样,该方法将仅修改Set内容,并且还可以为您处理重复(因为Set仅允许唯一值),因此您的代码会更干净。

示例:

private static final Random RNG = new Random();

private static void fillWithRandoms(Set<Integer> set) {
    while(set.size() < 4) {
        int rando = RNG.nextInt(9) + 1;
        set.add(rando);
    }
}

public static void main(String[] args) {
    Set<Integer> set = new HashSet<Integer>();

    fillWithRandoms(set);

    System.out.println(set);
}