【问题标题】:Passing type by reference in Java [duplicate]在Java中通过引用传递类型[重复]
【发布时间】:2013-10-31 00:58:31
【问题描述】:

我有一个问题:如何在方法 extendedEuclid 中传递原始长类型作为引用?我发现在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;
}

【问题讨论】:

  • @YousufUmar Java 按值传递所有内容。一种方法是将原始类型包装在组件类型中,然后传递该类型。

标签: java pass-by-reference


【解决方案1】:

基本上:在 Java 中,您不能对 long、int 等原始类型执行此操作,因为它们总是按值传递。查看Oracles Java tutorials 了解一些背景

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

public class EuclidReturnValues {
    long gcd;
    long latestA;
    long latestB;
}

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

public EuclidReturnValues extendedEuclid(long a, long b)

编辑:

将这个类嵌套到提供 euclid-algorithm 的类中也是一个好主意,这样它在主题上是连贯的

【讨论】:

    【解决方案2】:

    我发现在java中这是不可能的...

    正确,Java 完全是按值传递。

    ...还有其他解决方案吗?参数 long a 必须通过引用传递。

    至少有两种“正确”的方式,还有一种技巧:

    1. 不要尝试更改传入的参数;相反,将更新后的值作为函数的结果返回(连同x,有多种方法可以做到这一点)。

    2. 传入一个对象实例,该实例具有一个字段 a,您可以对其进行更新。

    3. (黑客)传入long[1] 数组; a 将是唯一可以更新的条目。

    【讨论】:

      【解决方案3】:

      您可以将原始值包装到一个对象中并公开一个getLongValue() 和一个setLongValue() 方法。

      【讨论】:

        【解决方案4】:
        【解决方案5】:

        嗯,差不多。如果您希望能够更改该值并将其反映在调用代码中,您可以执行以下操作:

        class ValueHolder {
            long value;
            //getter, setters, etc
        }
        

        并传递这个而不是你的long

        请注意,这不是通过引用传递,您只是传递 ValueHolder 引用的值而不是 long 值。

        猜你喜欢
        • 1970-01-01
        • 2013-05-16
        • 2011-08-28
        • 1970-01-01
        • 2020-06-11
        • 2011-06-03
        • 1970-01-01
        • 2017-12-20
        • 2021-08-21
        相关资源
        最近更新 更多