Java 是严格按值传递的。例如,如果我将一个整数传递给一个更改其值的方法并且不返回该值,则 main 方法中的整数将不会更改。
但是,当我将 ArrayList
传递给向列表添加项目的方法时,结果发现该方法更改了 main 方法中的 ArrayList。
public class test {
public static void main(String[] args) {
// create a array list
ArrayList<String> item = new ArrayList<String>();
addItems(item);
System.out.println("Items in the main method are: ");
for (int i = 0; i < item.size(); i++) {
System.out.println(item.get(i));
}
System.out.println("\n***************************\n");
int num = 0;
plusOne(num);
System.out.println("The value of num in the main method is: " + num);
}
//add two items to arrayList
public static void addItems(ArrayList<String> item) {
item.add("Item #1");
item.add("Item #2");
System.out.println("Items in the addItems method are: ");
for (int i = 0; i < item.size(); i++) {
System.out.println(item.get(i));
}
}
//add one to num
public static void plusOne(int num) {
num = num +1;
System.out.println("The value of num in the plusOne method is: " + num);
}
}
这是输出:
Items in the addItems method are:
Item #1
Item #2
Items in the main method are:
Item #1
Item #2
***************************
The value of num in the plusOne method is: 1
The value of num in the main method is: 0
这很令人困惑。
为什么 addItems()
更改了 item
而 plusOne()
没有更改 num
?
有人可以解释一下吗?谢谢!
最佳答案
您需要区分按值传递和按引用传递。
当您将一个对象(例如您自己的自定义类的实例或 List
实例)作为参数传递给您的方法时,它们是通过引用传递的。基本上,您仍然有一个指向原始对象的指针,并且您正在直接编辑该对象。这就是您在列表
中看到新项目的原因。
但是,在 Java 中,原始数据类型和不可变类(例如 String
)是按值传递的。换句话说,您在 plusOne
方法内收到的 num
与您在方法外部收到的 num
不同。这就是为什么您不会看到方法范围之外的更改。
只需查看 String 的文档即可您会看到大量方法接受 String
并返回一个新的 String
。他们不会直接修改输入字符串。
关于java - Java 中的参数传递(ArrayList 与 Integer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821763/