可能重复:Is Java “pass-by-reference” or “pass-by-value”?
我正在尝试以这种方式初始化数组 -
class Main {
public static void main(String[] args) {
int n = 4;
int[] s = null;
int[] f = null;
init(n, s, f);
System.out.println(s.length);
}
public static void init(int n, int[] s, int[] f) {
s = new int[n];
f = new int[n];
}
}
但我得到了 s.length
的 NullPointerException
。所以这个明确的将参数传递给另一个方法是按值传递。因此对象没有初始化。
但是当我确实以不同的方法交换值(value)时,这就起作用了。喜欢 -
class Main {
public static void main(String[] args) {
int n = 4;
int[] s = new int[n];
int[] f = new int[n];
s[0] = 10;
f[0] = 20;
System.out.println(s[0] + " " + f[0]);
swap(s, f);
System.out.println(s[0] + " " + f[0]);
}
public static void swap(int[] s, int[] f) {
int t = s[0];
s[0] = f[0];
f[0] = t;
}
}
另一方面,这不是交换值。
class Main {
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;
swap(a , b);
System.out.println(a + " " + b);
}
public static void swap(Integer a, Integer b) {
int t = a;
a = b;
b = t;
}
}
因此我需要一些解释 java 是“按引用传递”还是“按值传递”?这个解释可以帮助我理解为什么不能用另一种方法创建对象。
抱歉我的英语不好。提前致谢。
最佳答案
这行不通,因为 Java 按值传递,而不是按引用传递。
当你声明
int[] s = null;
然后您有一个 (null
) 对 int[]
的引用。但是当您将 s
传递给另一个方法时,会创建一个新变量(我们称它为 x
),并且引用 s
被复制到其中。对 x
引用的任何更改也会更改 s
引用,因为它们是同一件事;但对 x
本身的更改不会更改 s
,因为 x
和 s
是对同一内容的两个不同引用
可以这样想。您的 s
是剪贴板上的一个条目,剪贴板条目告诉您要查找的框的编号以查找 int[]
。当您将 s
传递给方法时,您会在剪贴板上得到一个新条目x
,带有相同框s
引用下的编号。这意味着任何查看框并更改其内容的操作都会影响您查看 s
所指的内容时得到的结果:它们都查看相同的框编号。但是,如果您更改剪贴板上的 x
条目,它不会更改剪贴板上 s
的条目,因为它们是两个不同的条目。
再举一个例子,将 s
和 x
视为指向同一个城镇的路标。如果您更改 x
指向的城镇,例如通过在市中心引入单向系统,s
指向的内容当然也会发生变化。但是,如果您更改路标 x
,并在上面写上不同的城镇名称,路标 s
也不会自动更改。它们是不同的标志,但表示同一件事。
关于java - 为什么不能在 java 中的另一个方法中创建引用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27347299/