【问题标题】:Shoud Java be considered as "Strictly pass by value"? [duplicate]Java应该被视为“严格按值传递”吗? [复制]
【发布时间】:2019-11-20 21:38:08
【问题描述】:

在传递值中,当参数按值传递给方法时,这意味着原始变量的副本被发送到方法而不是原始变量,因此在方法内部应用的任何更改实际上只影响复制版本而不是原始版本。

例如,

public class Test {



    private void squareNumber(int number){
        number=number*number;
    }

    public static void main(String[] args) {

       int x=2;


        System.out.println(x);  //output    =   2

        new Test().squareNumber(x);

        System.out.println(x);//output    =   2

    }
}

但是对于 Arrays 和 List,这不起作用,下面是 ArrayList 的示例

public class Test {


    private void squareOfList(List<Integer> integerList){
        for (int i=0;i<integerList.size();i++) {
            integerList.set(i,integerList.get(i)*integerList.get(i));

        }
    }


    public static void main(String[] args) {

        List<Integer> nums= new ArrayList<>();
        nums.add(2);
        nums.add(3);
        nums.add(4);
        nums.add(5);


        System.out.println(nums); // output  =  [2, 3, 4, 5]

        new Test().squareOfList(nums);

        System.out.println(nums);  // output  =  [4, 9, 16, 25]

    }

}

由于我们已将 nums 作为参数传递,因此只有方法内部的值应该更改,但它正在更改原始列表的值。 “严格按价值传递”这个术语是否成立?

【问题讨论】:

  • 确实不是。如果您阅读了有关该问题的答案,您就会明白为什么您的代码会以这种方式工作。
  • 对于非基元,Java 复制参考
  • 因为int是java中的原始类型,List是引用类型。当List 被复制时,引用被复制
  • @Mukul Bhardwaj Java 总是按值传递;对于非原语,Java 将引用的值传递给 Object,而不是 Object 本身。
  • 你的理解是正确的。这是否配得上“严格按价值”这个词是一场关于我没有参与的言论的斗争。

标签: java arrays list pass-by-value


【解决方案1】:

int 是原始类型,List 是引用类型。根据 JLS

引用类型由动态创建的对象实现,这些对象要么是类的实例,要么是数组的实例。可以存在对每个对象的许多引用。

当您在函数中传递任何引用类型的值时,只会复制该引用。现在两个引用(调用者、被调用者)都指向同一个动态分配的内存。如果您在被调用者中更改(动态分配的内存),它将反映在调用者中。

原始类型的变量保存该原始类型的值

int 是原始类型,它保存值。当传递给函数时,它会复制值,并且没有动态分配的共享内存。因此,您在函数中所做的所有更改都保留在函数中。

这个例子可以进一步阐明它

public class Test {
    private void squareOfList(List<Integer> integerList){
        integerList = new ArrayList<>(); // Refering to a different dynamically allocated memory
    }

    public static void main(String[] args) {
        List<Integer> nums= new ArrayList<>();
        nums.add(2);
        System.out.println(nums); // output  =  [2]
        new Test().squareOfList(nums);
        System.out.println(nums);  // output  =  [2]
    }

}

欲了解更多信息,请阅读 java 语言规范的第 4 章。

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 2011-12-15
    • 2018-07-19
    • 2013-01-21
    • 1970-01-01
    • 2021-11-04
    • 2013-03-06
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多