我可以在Java中通过引用传递整数吗?

时间:2019-04-02 12:20:14

标签: java function

在输入函数之后,我以为参数的值被修改了我的输入函数,但是没有。 我听说这是因为有参考意义...所以我对此有什么能做的吗?

,我不想在公共课程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);
    }
}

5 个答案:

答案 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()返回一个封装了新数据的新对象