在输入函数之后,我以为参数的值被修改了我的输入函数,但是没有。 我听说这是因为有参考意义...所以我对此有什么能做的吗?
,我不想在公共课程static int index = 0; ,,,
上写main()
。我试过了,但我想换一种方式
import java.io.IOException;
public class Main {
private static void input(int index, int[] arrayNumber, boolean isNumber) throws IOException {
////////////////////////////////////
// buffering keyValue in the array//
////////////////////////////////////
int keyValue = System.in.read();
while(!(keyValue == 0x0D|| keyValue ==0x0A)) {
if(index >= 10) {
System.out.println("Your MAX index : "+ index);
//System.exit(0);
break;
}
if(keyValue <'0'|| keyValue >'9') {
isNumber = false;
}else
arrayNumber[index] = keyValue;
index = index + 1;
keyValue = System.in.read();
}
}
private static void stringToInt(boolean isNumber, int index, int[]arrayNumber) {
////////////////////////////////////////////////////
//converting the keyValues in the array to integer//
////////////////////////////////////////////////////
if(isNumber) {
long number = 0;
for(int i = 0; i < index; i++) {
number = number * 10 + arrayNumber [i] - '0';
}
if(number > Integer.MAX_VALUE) {
System.out.println("MAX Value of int is 2147483647, Integer Overflow Exception: " + number);
}else {
System.out.println("number: " + number);
}
}
}
public static void main(String[] args) throws IOException {
boolean isNumber = true;
int index = 0;
int arrayNumber[];
arrayNumber = new int[10];
input(index, arrayNumber, isNumber);
//after the input function, the values of the variables are not modified
stringToInt(isNumber, index, arrayNumber);
}
}
答案 0 :(得分:1)
否,Java仅按值传递。您需要在函数中返回值。看到这里:Is Java "pass-by-reference" or "pass-by-value"?
答案 1 :(得分:1)
java中没有传递引用。但是,您可以传递对象引用(作为值)。
知道了这一点,您可以实现一个类来管理输入数据,如下所示:
public static class InputData {
public int value = 0;
}
public static void input(InputData id) {
id.value = 3;
}
public static void output(InputData id) {
System.out.println(id.value);
}
public static void main (String[] args) throws java.lang.Exception
{
InputData id = new InputData();
input(id);
output(id); // This will print 3
}
之所以起作用,是因为您没有触摸参考值,而是使用它来执行某些操作。
但是,我认为输入参数是代码的味道。像一些评论者一样,我建议使用返回值的方法:
public static class InputData {
public int value = 0;
}
public static InputData input() {
InputData data = new InputData();
data.value = 3;
return data;
}
public static void output(InputData id) {
System.out.println(id.value);
}
public static void main (String[] args) throws java.lang.Exception
{
InputData id;
id = input();
output(id);
}
答案 2 :(得分:0)
您可以建立自己的“参考”
class Box<T> {
T val;
}
void foo(Box<Integer> intBox) {
intBox.val = intBox.val + 1
}
答案 3 :(得分:0)
尝试AtomicInteger。它应该工作。这是线程安全的。
答案 4 :(得分:0)
这是正在发生的事情:
1-您正在定义一些局部基本变量。
2-您正在调用并将这些变量值传递给输入法(已复制变量的值)
3-您正在对input()方法的本地变量进行更改。
并且正如预期的那样,main()函数中的外部变量不受影响。 那该怎么办?
好吧,您可以做的是将局部变量封装在类中,创建该类类型的对象,然后将其传递给input()函数(基本上这就是 OOP 的全部内容)
在这种情况下,您将把对创建的对象的引用传递给input()方法(该引用将被复制),该方法将在该对象上调用setter(如果有),并且您将变量更改为你想。
但是我不会共享这样的状态,只是让input()返回一个封装了新数据的新对象