我是编程以及本网站的新手,所以请原谅我,如果我搞砸了。我有一点时间搞清楚如何在这里正确发布我的代码。
package tester;
import java.util.*;
public class Mainclass2 {
public static void main(String[] args) {
int y = 3;
int[] x = {1, 2, 3, 4};
editnumbersArray(x);
editnumbersNotArray(y);
System.out.println(x[2]); **//now this was changed from 3 to 9...**
System.out.println(y); //but this one went unchanged.
}
//this accepts 'x[]' into the 'a[]' parameter.
public static void editnumbersArray(int[] a){
a[2] = 9; **//<---why does this one CHANGE the actual x[2] instead of just a[2]?**
}
//this accepts 'y' into the 'a' parameter.
public static void editnumbersNotArray(int a){
a = 9; **//<--while this one only changes 'a' instead of 'y'?**
}
}
所以我的问题基本上都是作为评论输入的。当传递给另一个方法的int没有改变时,为什么传递给方法的数组会改变原始数组(x [])的值?我确定这是一个简单的答案,但是当我进行研究时,我无法弄清楚要搜索的内容。我不知道这叫什么,所以我搜索的一切都让我走错了路。谢谢你的帮助!!
编辑:感谢您对该地址的类比!这是迄今为止您向我解释的最佳方式。所以基本上当你将一个数组传递给一个参数时,它传递一个引用,而不是实际值?因此,当我在我的方法中进行调整时,它会改变数组所引用的内容吗? 我注意到这也发生在列表中。所以列表实际上并没有按值传递?似乎数组/列表本身基本上都被传入进行编辑,无论我在我的方法中命名它(在这种情况下是[]。)
编辑 http://javadude.com/articles/passbyvalue.htm此页面确实清除了它。抱歉发布重复的问题。问题是我不知道我想问什么。我从来没有听过这些术语&#34;传值/参考&#34;,所以现在我知道了
答案 0 :(得分:9)
更改参数本身的值永远不会影响Java中的参数,因为所有参数都是按值传递的。但是,看看这个方法:
public static void editnumbersArray(int[] a){
a[2] = 9;
}
该分配不更改参数的值。 a
的值对于同一个数组仍然是相同的引用 - 它只是更改了数组的内容。
想象一下,如果我在一张纸上写下你的家庭住址。你对那张纸做了什么并不重要 - 这不会改变我住的地方。但是,如果您访问了该地址并将前门涂成了绿色,而根本没有更换任何纸张,我将看到该更改。
区分不同的概念非常重要:
int
)或引用。在上面的例子中,这张纸就像变量一样。数组是一个对象,充当其他变量的容器。所以a
的值只是对数组的引用。
答案 1 :(得分:1)
Java使用传递值(您要搜索的内容)来处理所有事情。从本质上讲,这意味着它会创建一个参数的副本,然后将其传递给该方法。这意味着你不能通过使用=运算符来改变某些东西。
这就是(int a)
版本不会改变的原因。
但是,对于Object或数组,它不会复制Object或数组,它会复制Object或数组的引用。这意味着您有两个变量,原始on和示例中的(int[] a)
一个,它们都指向内存中的相同位置。对任一变量的更改都会影响另一个变量。
按值传递,按引用传递,按值传递引用是您要搜索的内容类型以获取更多信息。