2
public class test {
    public static void main(String[] args) {
        boolean flag=false;
        char[] c=new char[5];
        c[0]='e';
        read(flag, c);

        System.out.println(c[0]);
        System.out.println(flag);
    }

   public static void read(boolean flag, char[] c){
        flag=true;
        c[0]='a';
   }
}

在上面的代码中,我发现了一个有趣的问题:char[] c已更改并打印结果正确,但布尔标志没有更改!我不知道这是怎么回事?现在,我也想更改标志,如何做到这一点?感谢您的帮助!

4

3 回答 3

8

boolean是按值传递的。如果您在read方法中更改它,那么只会更改本地副本,而不是外部值。

但是,对的引用是按c值传递的,有效地使引用的数组c通过引用传递。因此,更改c此处的元素确实会影响外部数组。

于 2013-03-15T00:15:49.327 回答
0

不同之处在于 Java 处理数组和原语的方式。

数组

Java 将数组(以及其他对象)作为引用类型来处理。这意味着 Java 并没有为方法提供数组本身。相反,该方法接收一个数字(引用),告诉它数组的存储位置。

因此,任何接收数组的方法都不会获取数组的副本;它正在改变原始数组。如果您通过 a) 调用对象上的方法或 b) 下标[]数组来修改对象,它将更改原始对象。

基元(boolean等)

基元的工作方式与数组不同。方法不接收对原语的引用;他们收到原语的副本。这是因为原语比对象更简单,并且与复制对象相关的性能损失不适用于最多约 8 字节的原语。

因此,您将收到传递给该方法的布尔值的副本。因此,更改副本不会影响原件。

希望这有帮助!

于 2013-03-15T00:20:52.530 回答
0

你对这两个论点做了不同的事情。您只需分配给布尔值,它只会更改您的布尔值副本。

另一方面,您使用数组引用参数的副本来修改它指向的数组。相反,如果你做了一个简单的赋值:c = null;或者c = new char[30];你会改变你的参数副本,但不会影响调用者的副本,就像布尔值一样。

当然,与布尔表达式相比,您可以使用引用表达式做更多的事情。

于 2013-03-15T00:23:28.127 回答