为什么不能在java中的另一个方法中创建引用的对象?
可能的重复项: 我正试图以这种方式初始化数组-为什么不能在java中的另一个方法中创建引用的对象?,java,object,methods,reference,pass-by-reference,Java,Object,Methods,Reference,Pass By Reference,可能的重复项: 我正试图以这种方式初始化数组- 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
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
。因此,将参数传递给另一个方法的这种明确方式就是按值传递。因此,不初始化对象。
但当我用另一种方法交换到值时,这就起作用了。像-
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有按值传递,而不是按引用传递
当你申报时
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
。它们是不同的符号,但表示相同的东西。一个人设置一个值,一个人初始化某个东西(通过重新指定)。按引用值传递时会有很大的不同。原语按值传递(提供副本),对象的指针按值传递。一个人设置一个值,一个人初始化(通过重新分配)。按引用值传递时会有很大的不同。原语是按值传递的(副本是给定的),对象的指针是按值传递的。因此,基本上在第一段代码中,init
functions=new int[n]
创建了不同的对象,它没有从调用函数指向我传递的参数。这是可以理解的。非常感谢。因此,基本上在第一段代码中,init
functions=new int[n]
创建了不同的对象,该对象不指向调用方函数传递的参数。这是可以理解的。非常感谢。