Java 方法无法修改输入int参数

Java 方法无法修改输入int参数,java,class,methods,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 m

不知道为什么整数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() 
    {

    }
}
其余的类目前是空的,所以我不认为我也需要把它们放在这里。

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

input.range(lowRange, highRange);
它将这些变量的当前值提供给
input.range
,但不提供
input.range
修改它们的方法。在
范围中
方法:

public static void range(int lowRange, int highRange) 
参数
low-range
high-range
(与
GuessNumber
中的变量无关,即使名称相同)是您传入的内容的副本。在方法中指定
lowlange=…
时,它会更改副本,但对
GuessNumber
中的
lowlange
highRange
没有任何影响

您需要编写一个
range
方法来返回两个值。这需要做一点工作,但我会编写一个
范围
类,该类具有
成员,然后将方法更改为

public static Range range()
该方法必须创建一个新的
范围
对象。我认为
low
high
可以成为
范围的公共成员

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

通常情况下,类中的公共数据是一件坏事,但对于一个唯一目的是让方法返回多个值的类来说,我认为这没关系

下面是一段简化的代码,它再现了您的问题,并确保您了解问题产生的原因和解决方案:

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);
  }
}

另一个常见的解决方案是传入一个“holder对象”作为结果。尽管对象引用是按值传递的,但对象引用的副本仍然指向与调用方相同的对象。我不会深入讨论这个问题,因为它不太常见,一旦您更好地理解了值(包括对象引用)是如何传递的,您就应该能够找到正确的方法。您是否需要
范围()
编号()
调用以修改这些变量?您应该使
GuessNumber的实例成为非静态的,并且使字段成为非静态的。rand类没有让它们生成computerGenedNumber。您还记得Java中的参数总是按值传递吗?@lukeb28 Lemme guess;它总是返回0?还可以创建一个新实例(即
GuessNumber gn=new GuessNumber()
,传递该实例(
input.range(gn)
),并在
范围()内设置变量
使用
gn.lowRange=foo;
。我对需要在哪里进行更改有点困惑。@lukeb28更改
range
方法以返回
range
;在该方法中,
lowRange
highRange
将是局部变量,而不是参数,该方法将需要创建一个
新范围
o对象返回值。要调用它,类似于
Range r=input.Range()
,然后
r.low
r.high
将是您想要的范围边界。
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);
  }
}