Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不能在java中的另一个方法中创建引用的对象?_Java_Object_Methods_Reference_Pass By Reference - Fatal编程技术网

为什么不能在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
function
s=new int[n]
创建了不同的对象,它没有从调用函数指向我传递的参数。这是可以理解的。非常感谢。因此,基本上在第一段代码中,
init
function
s=new int[n]
创建了不同的对象,该对象不指向调用方函数传递的参数。这是可以理解的。非常感谢。