【发布时间】: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