Java函数参数是否总是按数组的值传递?

Java函数参数是否总是按数组的值传递?,java,arrays,pass-by-value,Java,Arrays,Pass By Value,可能重复: 如果我们有一个大的字节[]数组(比如40Mb),并且我们想用方法发送它 method(array); 是否要复制阵列?因此,在Javaenv=>80Mb中,内存将再增加40Mb,对吗 如果是,调用该方法后如何销毁“first”数组?不会创建新的对象,只会将引用复制到函数参数。变量数组实际上只是对数组对象的引用。将数组传递给函数时,只是复制引用,而不是引用引用的实际数组。Java始终是按值传递的。对于基元类型,传递的值是变量的值;对于对象,传递的值是变量持有的引用的值 在本例中,数

可能重复:

如果我们有一个大的
字节[]
数组(比如40Mb),并且我们想用方法发送它

method(array);
是否要复制阵列?因此,在Javaenv=>80Mb中,内存将再增加40Mb,对吗


如果是,调用该方法后如何销毁“first”数组?

不会创建新的
对象,只会将引用复制到函数参数。

变量
数组
实际上只是对数组对象的引用。将
数组
传递给函数时,只是复制引用,而不是引用引用的实际数组。

Java始终是按值传递的。对于基元类型,传递的值是变量的值;对于对象,传递的值是变量持有的引用的值


在本例中,数组是一个对象,通过值传递的是对该对象的引用。因此,不,将不复制阵列。

不,将不复制阵列

在Java中,一切都总是通过值传递

非基本类型的变量是对对象的引用。数组是一个对象,数组类型的变量是对该数组对象的引用

调用采用非基元类型参数的方法时,引用通过值传递——这意味着复制引用本身,而不是它引用的对象

Java通过值传递对象作为引用

所以堆中只有一个对象副本。查找以下示例:From


否,将不复制阵列。事实上,因为:

  • 在Java中,所有内容都是按值传递的

  • 数组本身是一个对象

  • 因此,结果是
    array'
    将复制方法,但它包含的内容:bytes元素不会复制。因此,在
    方法中更改数组的所有内容都将影响原始数组


    所以,内存不会像您看到的那样加倍:)

    只是好奇,在第2点,“数组”是否扩展了“对象”?:-)java中的每个对象都扩展了对象;)原语数组是一个对象?的确!另见
    public void foo(Dog d) {
      d.name.equals("Max"); // true
       d = new Dog("Fifi");
       d.name.equals("Fifi"); // true
     }
    
    Dog aDog = new Dog("Max");
    foo(aDog);
    aDog.name.equals("Max"); // true