方法不能修改输入int参数

时间:2014-01-14 01:08:10

标签: java class methods

不确定为什么整数lowRange和highRange不在这些类之间。

package guessnumber;
public class GuessNumber 
{
    static public int computerGenedNumber;
    static public int lowRange;
    static public int highRange;
    static public int playerGuess;
    public static void main(String[] args) 
    {
        Input.range(lowRange, highRange);
        Rand.number(lowRange, highRange, computerGenedNumber);
        Input.guess();

        Give.result();
    }
}

下一课:

package guessnumber;
import javax.swing.JOptionPane;
class Input 
{
    public static void range(int lowRange, int highRange) 
    {
        String rawUserInput;
        rawUserInput = JOptionPane.showInputDialog("Please enter the range you wish to guess. (EX: 1-10)", "1-10");
        for(int i = 0; i < rawUserInput.length(); i++)
        {
            if(rawUserInput.charAt(i) == '-')
            {
                lowRange = Integer.parseInt(rawUserInput.substring(0, i));
                highRange = Integer.parseInt(rawUserInput.substring(i + 1, rawUserInput.length()));
            }
        }
    }
    static void guess() 
    {

    }
}

最后一个相关的:

package guessnumber;
class Rand 
{
    static public void number(int lowRange, int highRange, int computerGenedNumber) 
    {
        computerGenedNumber = (int)(Math.random() * (highRange - lowRange) + lowRange);
    } 
}

其他课程目前都是空白的,所以我不认为我也需要把它们放在这里。

2 个答案:

答案 0 :(得分:1)

这是一段简化的代码,它可以重现您的问题,并确保您了解它导致问题的原因和解决方案:

class Foo {
  public static void square(int a, int result) {
    result = a*a;
  }
}

class Bar {
  public static void main(String[] args) {
    int a=2;
    int result = 0;

    Foo.square(a, result);
    System.out.println("result " + result);
  }
}

这应该是对Java的基本理解。查看“按值传递”的含义

简而言之,方法中传递的参数是参数的副本。因此,当您更改方法中的参数时,您只是更改另一个数据,并且您的更改不会反映给调用者。

一种解决方法是更改​​方法并返回结果,如下所示:

class Foo {
  public static int square(int a) {
    return a*a;
  }
}

class Bar {
  public static void main(String[] args) {
    int a=2;
    int result = 0;

    result = Foo.square(a);
    System.out.println("result " + result);
  }
}

另一种常见的解决方案是传递“持有者对象”作为结果。虽然对象引用是按值传递的,但对象引用的副本仍然指向与调用者相同的对象。我不会对此深入研究,因为它不太常见,一旦你更好地了解了价值(包括对象参考)的传递方式,你应该能够做到这一点。

答案 1 :(得分:0)

参数在Java中“按值”传递。这意味着当你打电话时

input.range(lowRange, highRange);

它将这些变量的当前值提供给input.range,但它没有给input.range提供修改它们的方法。在range方法中:

public static void range(int lowRange, int highRange) 

参数lowRangehighRange(与GuessNumber中的变量没有关联,即使名称相同)也是副本的内容您传入。当您在方法中指定lowRange = ...时,它会更改副本,但对lowRange中的highRangeGuessNumber完全没有影响。

您需要编写返回两个值的range方法。这需要一些工作,但我会写一个Range类,其中包含lowhigh成员,然后将您的方法更改为

public static Range range()

该方法必须创建一个新的Range对象。我认为lowhigh成为Range的公开成员是可以的:

class Range {
    public int low;
    public int high;
    public Range(int low, int high) { 
        this.low = low;
        this.high = high;
    }
}

通常,类中的公共数据是一件坏事,但对于一个只允许方法返回多个值的类,我认为是可以的。