java - 为什么不能在 java 中的另一个方法中创建引用对象?

标签 java object methods reference pass-by-reference

可能重复: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.lengthNullPointerException。所以这个明确的将参数传递给另一个方法是按值传递。因此对象没有初始化。 但是当我确实以不同的方法交换值(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,因为 xs 是对同一内容的两个不同引用

可以这样想。您的 s 是剪贴板上的一个条目,剪贴板条目告诉您要查找的框的编号以查找 int[]。当您将 s 传递给方法时,您会在剪贴板上得到一个条目x,带有相同s 引用下的编号。这意味着任何查看框并更改其内容的操作都会影响您查看 s 所指的内容时得到的结果:它们都查看相同的框编号。但是,如果您更改剪贴板上的 x 条目,它不会更改剪贴板上 s 的条目,因为它们是两个不同的条目。

再举一个例子,将 sx 视为指向同一个城镇的路标。如果您更改 x 指向的城镇,例如通过在市中心引入单向系统,s 指向的内容当然也会发生变化。但是,如果您更改路标 x,并在上面写上不同的城镇名称,路标 s 也不会自动更改。它们是不同的标志,但表示同一件事。

关于java - 为什么不能在 java 中的另一个方法中创建引用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27347299/

相关文章:

java - 如何将以下字符串转换为 Java 中的日期或日历对象?

java - 将方法组合在一种方法中还是使用多种方法更好?

java - 在重写方法时面临问题

java - ORA-00911 : invalid character error using a PreparedStatement

java - 安卓应用程序设计 : Viewflipper or Activities?

javascript - 用另一个数组对一个对象数组进行排序

javascript - set array = 多维对象数组的一维值

c# - 在 winForm C# 中使用 System.Threading.Timer 间隔触发方法

java - Kafka消费者输出的数据不一致

java - 将序列化对象写入文件