java - 修改 Java 中作为参数传递的数组

标签 java methods encapsulation

为什么会这样,按排序顺序显示数组?:

Integer[] array={7,5,9,3,6,0,2,4};

MergeSort.mergeSort(array,0,7);

System.out.println(Arrays.toString(array));

具体来说,为什么将 array 传递给 public static void 方法 mergeSort 最终会修改数组本身?我认为 Java 可以避免这种情况。例如这段代码:

  public static void main(String[] args){
    int c=2;
    change(c);
    System.out.print(c);
  }
  public static void change(int c){
    c=4;
  }

返回 2 而不是 4。我很困惑为什么 Java 允许修改作为参数传递的数组,而不是 int

最佳答案

因为 Java 是按值传递的,当您传递 Object(数组是一个 Object)时,您会将引用的值传递给 Object 。相反,原语没有引用,因此您只需传递值。

编辑

同样,您可以使用内置的 Arrays.sort()方法对数组进行排序。 Java 数组不是原始类型。在 Java 中,原始包装类型是不可变的(如 String)。考虑一下,

private static void change(String in) {
    in = in + " World"; // <-- modifies in here, can't change caller's reference.
}

private static void change(StringBuilder in) {
    in.append(" World"); // <-- uses reference from caller.
}

public static void main(String[] args) {
    String str = "Hello";
    StringBuilder sb = new StringBuilder(str);
    change(str);
    change(sb);
    System.out.println("one: " + str);
    System.out.println("two: " + sb);
}

关于java - 修改 Java 中作为参数传递的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855600/

相关文章:

java - 如何使用服务访问每个 Activity 的值

java - 从一个 Eclipse 插件在另一个插件中访问 jar

java - 在C中使用私钥加密数据,在Java中使用公钥解密数据

java - 如何为中间相遇攻击收集数据?

ios - Swift,为什么类方法不需要闭包列表

java - 从作为第一个对象中的字段的对象访问对象的字段

Javascript,从静态函数打印全局对象

javascript - 如何在方法中的 addEventListener 和 JavaScript 中的全局函数中的 removeEventListener 时调用 removeEventLisener

java - 什么时候应该使用封装?

c - 那么,如何将程序模块化并实现信息隐藏呢?