【问题标题】:Why it is not possible to create object of a reference in another method in java?为什么不能在 java 中的另一个方法中创建引用对象?
【发布时间】:2015-02-05 11:27:13
【问题描述】:

可能重复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];
}
}

但我得到了NullPointerExceptions.length。因此,将参数明确传递给另一个方法是按值传递。因此对象没有被初始化。 但是当我用不同的方法换取价值时,这是可行的。喜欢 -

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 “pass-by-reference”还是“pass-by-value”?这个解释可以帮助我理解为什么不能用另一种方法创建对象。

对不起,我的英语不好。提前致谢。

【问题讨论】:

  • 一个设置一个值,一个初始化一些东西(通过重新分配)。在通过参考值传递时有很大的不同。
  • 基元按值传递(给定副本),对象的指针按值传递。

标签: java object methods reference pass-by-reference


【解决方案1】:

这行不通,因为 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。它们是不同的符号,但表示相同的东西。

【讨论】:

  • 所以基本上在第一段代码中,init 函数s = new int[n] 创建了不同的对象,它没有从调用函数指向我传递的参数。这是可以理解的。非常感谢。
猜你喜欢
  • 2014-07-16
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2014-08-11
相关资源
最近更新 更多