Java 方法无法修改输入int参数
不知道为什么整数lowRange和highRange不在这些类之间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
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);
}
}