更改方法Java中的变量值

这个问题在这里已经有了答案:

  • Java是“通过引用传递”还是“按值传递”? 78个答案

  • 请看Jon Skeet关于Java中参数传递的文章,这解释了这一点。

    总之(看他的网站更全面的解释):

    数组是参考类型。 如果传递指向数组的引用,则会复制该引用的值并将其分配给该函数的参数。 所以参数将指向与传递的参数相同的数组。 因此,通过函数的参数对数组所做的更改将在调用函数中可见。 然而,改变参数本身(b),例如通过设置它为空,调用函数不会注意到,因为参数(b)只是传递的参数(tiger)的一个副本。

    整数是所谓的基本类型。 传递整数复制其值并将其分配给参数。 但是这个价值并不是对实际数据的参考,而是数据本身。 因此,对函数中参数的更改将影响参数(a),但不会影响调用函数(bird)中传递的参数。


    基本上,对象(如数组)通过“引用”传递给方法。 所以当你改变对象时,它会改变传入方法的同一个对象。

    基元(比如int)是“按值传递”的,所以你在a中赋值的变量与传入的int变量不一样。

    我希望这有帮助...


    那是因为你申报的时候

     public static void funk(int a, int[] b) 
    

    变量a的范围只是该方法。 然后,当您更改该值时,您只会更改方法中变量的值。

    关于b。 这就是在main中创建的同一个数组的新对象引用,这就是为什么它的值看起来会发生改变(下面的数组对象正在改变)

    但试试这个:

    public static void funk(int a, int[] b) { 
        // create a new reference for b
        int[] c = new int[b.length];
        c[0] = b[0];
        b = c;
    
        // The same.
        b[0] = b[0] * 2; 
        a = b[0] + 5;
    } 
    

    当你这样做时,老虎的价值也不会改变(只有在funk中创建的新数组c的内容)

    你可以使用包装器来模拟通过ref。 看到这篇文章。

    虽然我对此没有任何评论

    编辑只是为了好玩:

    我修改了你的代码来使用上面发布的包装器。

    它看起来很奇怪,但看起来像它的作品。

    // By ref simulated.
    public class Test {
    
        public static void funk(_<Integer> a, int[] b) { 
            b[0] = b[0] * 2; 
            a.s(  b[0] + 5 ) ;
        } 
    
        public static void main(String[] args) {
            _<Integer> bird = new _<Integer>(10);
            int[] tiger = {7};
    
            Test.funk( bird , tiger );
    
            System.out.println("bird = " + bird );
            System.out.println("tiger = " + tiger[0] );
    
        }
    
    }
    

    打印

    bird = 19
    tiger = 14
    

    :-S

    链接地址: http://www.djcxy.com/p/3513.html

    上一篇: Changing the values of variables in methods, Java

    下一篇: java