English 中文(简体)
在Java中更改方法中变量的值。[重复]
原标题:
  • 时间:2009-01-28 23:40:32
  •  标签:

我有一个有关Java方法中更改变量值的问题。

这是我的代码:

public class Test {
    public static void funk(int a, int[] b) { 
        b[0] = b[0] * 2; 
        a = b[0] + 5;
    } 

    public static void main(String[] args) {
        int bird = 10;
        int[] tiger = {7};

        Test.funk(bird, tiger);
    }
}

执行方法 Test.funk(bird, tiger) 后,bird 的值没有改变 - 它仍然是值 10,尽管在 funk() 方法中我们已经使用 a = b[0] + 5; 改变了该值。

另一方面,数组中元素的值发生了改变,因为我们有语句b [0]=b [0]*2;

我不明白为什么一样东西会变,而另一样却没有变?有人可以请解释一下吗?

问题回答

请看Jon Skeet有关Java参数传递的文章 Parameter-Passing in Java ,它详细解释了这个问题。

简而言之(请查看他的网站以获取更详尽的解释):

数组是引用类型。如果传递一个指向数组的引用,引用的值会被复制并赋给函数的参数。因此,参数将指向与传递的参数相同的数组。因此,通过函数参数对数组所做的更改将在调用函数中显示。然而,更改参数本身(b),例如将其设置为 null ,将不会被调用函数注意到,因为参数(b)只是传递的参数(tiger)的副本。

整数被称为原始类型。传递整数会复制其值并将其分配给参数。但该值不是对实际数据的引用,而是数据本身。因此,在函数中对参数(a)的更改将影响参数,但不会影响调用函数中传递的参数(bird)。

基本上,对象(如数组)通过“引用”传递到方法中。因此,当您更改对象时,它会更改传递到方法中的相同对象。

原始类型(如 int)被“按值传递”,因此您在 a 中分配值的变量与传递的 int 变量不是同一个变量。

我希望这可以帮助到你。

这是因为当你声明

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

变量a的范围仅限于该方法。因此,当您更改该值时,您只更改该方法中的变量的值。

关于 b。这是对在主函数中创建的同一数组的新对象引用,所以它似乎值发生了改变(实际上发生改变的是数组对象本身)。

但是试试这个:

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;
} 

当你这样做时,你会发现老虎的价值也没有发生变化(只是在函数中创建的新数组C的内容发生了变化)。

你可以使用包装器来模拟引用传递。请看这篇文章。

虽然我没有关于那个的任何评论

编辑只是为了好玩:

我已修改您的代码,使用上面发布的封装。

它看起来相当奇怪,但似乎有效。

// 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

Sorry, as an AI language model, I cannot determine the context and meaning of "-S" to provide an accurate Chinese translation. Can you please provide more context or information?

一个变量通过引用传递,另一个变量是按值传递。

“传值与传引用有什么区别?”





相关问题