在Java中通过引用传递类型

Str*_*usa 0 java pass-by-reference

我有一个问题:如何在方法extendedEuclid中传递原始long类型作为引用?我发现它在java中是不可能的,还有其他解决方案吗?

参数long a必须通过引用传递,这是下面的代码.

public long extendedEuclid(long a, long b) //a have to be passed as a reference
{
    long x = 0;
    long y = 1;
    long lx = 1;
    long ly = 0;
    long temp_a;
    List quotient = new ArrayList<>();

    while(b != 0)
    {
       quotient.add(a/b);
       temp_a = a;
       a = b;
       b = temp_a % b;
    }

    long temp_x = x;
    long temp_y = y;

    for(int i=0; i<quotient.size()-1; i++)
    {
        x = lx - quotient.indexOf(i) * x;
        y = ly - quotient.indexOf(i) * y;

        lx = x;
        ly = y;

        i++;
        if (i == quotient.size() - 1)
            break;

        x = temp_x - quotient.indexOf(i) * x;
        y = temp_y - quotient.indexOf(i) * y;

        temp_x = x;
        temp_y = y;
    }
    return x;
}
Run Code Online (Sandbox Code Playgroud)

xmo*_*oex 5

基本上:你不能用Java中的long,int等原始类型来做这件事,因为它们总是按值传递.查看Oracles Java教程的一些背景知识

如果您使用包含类的自定义返回值,则可以非常简单地解决此问题

public class EuclidReturnValues {
    long gcd;
    long latestA;
    long latestB;
}
Run Code Online (Sandbox Code Playgroud)

并将方法的签名更改为(假设您也更改了代码!)

public EuclidReturnValues extendedEuclid(long a, long b)
Run Code Online (Sandbox Code Playgroud)

编辑:

将此类嵌入到提供euclid算法的类中也是一个好主意,因此它在主题上是连贯的