Java中通过引用传递类型

Java中通过引用传递类型,java,pass-by-reference,Java,Pass By Reference,我有一个问题:如何在方法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 t

我有一个问题:如何在方法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;
}
public长扩展的euclid(long a,long b)//a必须作为引用传递
{
长x=0;
长y=1;
长lx=1;
longly=0;
长温;
列表商=新的ArrayList();
而(b!=0)
{
商。加(a/b);
温度a=a;
a=b;
b=温度a%b;
}
长温度x=x;
长温y=y;
对于(int i=0;i
我发现这在java中是不可能的

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

…是否有其他解决方案?参数长a必须通过引用传递

至少有两种“正确”的方法,还有一种破解方法:

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

  • 传入一个对象实例,该实例包含一个字段,
    a
    ,您可以对其进行更新

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

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

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

    …是否有其他解决方案?参数长a必须通过引用传递

    至少有两种“正确”的方法,还有一种破解方法:

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

  • 传入一个对象实例,该实例包含一个字段,
    a
    ,您可以对其进行更新

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


  • 几乎可以。如果您希望能够更改值并将其反映在调用代码中,您可以执行以下操作:

    class ValueHolder {
        long value;
        //getter, setters, etc
    }
    
    并传递此信息,而不是传递您的
    long


    请注意,这不是按引用传递,您只是传递
    值持有者
    引用的值,而不是
    long
    值。

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

    class ValueHolder {
        long value;
        //getter, setters, etc
    }
    
    并传递此信息,而不是传递您的
    long

    请注意,这不是通过引用传递,您只是传递
    值持有者
    引用的值,而不是
    值。

    您可以使用:

    您可以使用:


    您可以将基本值包装到对象中,并公开
    getLongValue()
    setLongValue()
    方法。

    您可以将基本值包装到对象中,并公开
    getLongValue()
    setLongValue()
    method.

    基本上:Java中的long、int等基本类型都是通过值传递的,所以不能这样做。请查看一些背景资料

    如果使用包含类的自定义返回值(如

    public class EuclidReturnValues {
        long gcd;
        long latestA;
        long latestB;
    }
    
    并将方法的签名更改为(假设您也更改了代码!)

    编辑:


    将该类嵌套到提供欧几里德算法的类中可能也是一个好主意,这样它的主题基本上是一致的:Java中的long、int等基本类型不能这样做,因为它们总是通过值传递。请查看一些背景资料

    如果使用包含类的自定义返回值(如

    public class EuclidReturnValues {
        long gcd;
        long latestA;
        long latestB;
    }
    
    并将方法的签名更改为(假设您也更改了代码!)

    编辑:


    将该类嵌套到提供类的欧几里德算法中也是一个好主意,这样它在主题上是一致的

    @YousufUmar Java按值传递所有内容。一种方法是将基元类型包装到组件类型中,然后传递该类型。@YousufUmar Java按值传递所有内容。一种方法是将基元类型包装到组件类型中,并传递该类型。或者简单地使用或简单地使用