有些参数可以在方法中更改,但有些参数不能在java中更改

有些参数可以在方法中更改,但有些参数不能在java中更改,java,Java,在上面的代码中,我发现了一个有趣的问题:char[]c已经更改,并且正确地打印结果,但是布尔标志没有更改!我不知道这是怎么发生的? 现在,我也想改变国旗,怎么做? 谢谢你的帮助 通过值传递布尔值。如果在read方法中更改它,则只会更改本地副本,而不会更改外部值 但是,对c的引用是按值传递的,有效地使c引用的数组按引用传递。因此,在这里更改c元素确实会影响外部数组。区别在于Java处理数组和原语的方式 阵列 Java将数组(以及其他对象)作为引用类型处理。这意味着Java没有将数组本身赋予该方法。

在上面的代码中,我发现了一个有趣的问题:
char[]c
已经更改,并且正确地打印结果,但是布尔标志没有更改!我不知道这是怎么发生的? 现在,我也想改变国旗,怎么做?
谢谢你的帮助

通过值传递
布尔值。如果在
read
方法中更改它,则只会更改本地副本,而不会更改外部值


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

区别在于Java处理数组和原语的方式

阵列 Java将数组(以及其他对象)作为引用类型处理。这意味着Java没有将数组本身赋予该方法。相反,该方法接收一个数字(一个引用),告诉它数组存储在哪里

因此,任何接收阵列的方法都不是获取阵列的副本;它正在更改原始数组。如果通过a)调用对象上的方法或b)订阅
[]
数组来修改对象,则会更改原始值

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

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


希望这有帮助

使用这两个参数可以做不同的事情。只需指定布尔值,这只会更改布尔值的副本

另一方面,可以使用数组引用参数的副本来修改它所指向的数组。相反,如果您做了一个简单的赋值:
c=null
c=新字符[30]
您本可以更改参数的副本,但不会影响调用方的副本,就像布尔值一样


当然,使用引用表达式比使用布尔表达式要多得多。

不同之处在于,一个参数是引用参数(数组),另一个是基元。由于Java方法参数只是按值传递的,因此不能在方法中更改原语,也不能更改对参数的引用,但可以更改引用对象的内容。把阵列想象成一个鸡蛋箱。你不能因为“按值传递”而改变鸡蛋箱,但是你可以改变鸡蛋箱中的鸡蛋。我一直认为这是一篇很好的文章,可以理解java参数传递+1的正确性,并提到两者都是按值传递的,你几乎让我在“布尔值是按值传递的”,但我看到你提到了这一点“对c的引用是通过值传递的”。是的,你是对的!这种情况类似于在c语言中传递的参数。但是在c中,我可以使用&flag作为参数,*flag=true,这可以更改标志。在JAVA中如何做到这一点?你有好的方法吗?
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';
   }
}