Java 中的引用传递

Aryan Tyagi 2023年10月12日
Java 中的引用传递

指针是编程语言体系结构中的一个变量,它隐式地监视特定数据的地址。另一个变量的等价物称为引用。对参考变量所做的任何修改都会对原始变量产生直接影响。

Java 是一种传值语言。它在其规范中声明它从来不是一种传递引用语言。在 Java 中,由于引用的二义性,这两个术语之间存在很多混淆。我们将在这篇文章中试图澄清它。

让我们讨论按值传递。在这里,形式参数的值被复制到用于在方法/函数执行期间存储它的位置。这个位置通常有一个为此目的分配的内存块。

在传递引用中,形式参数的值被复制到用于在方法/函数执行期间存储它的位置。这个位置通常有一个为此目的分配的内存块。

Java 被提升为一种健壮且安全的语言,Java 的一个好处是它不像 C++ 那样启用指针。他们甚至为这个概念选择了一个不同的术语,正式将它们称为参考

掌握这一点的关键是考虑诸如

Object Obj;

它是一个指向 Object 的指针,而不是一个 Obj。术语引用在 Java 中被误解,并且是大多数混淆的根源。在其他编程语言中,他们称之为引用作为指针工作。

当我们谈论 Java 中的对象时,我们谈论的是称为引用的对象句柄,它们也是由值提供的。

在上面的代码中,你有效地将构造的对象地址发送到方法。

Java 与 C 的相似之处在于它是一种过程语言。你可以分配一个指向方法的指针,将其发送到那里,在方法内部跟踪它,并更改它指向的数据。另一方面,你对指针位置所做的任何更改都不会被调用者注意到。(在传递引用语言中,方法函数可以在调用者没有意识到的情况下更改指针。)

考虑替换传入变量的引用参数。我们传入的变量是在分配别名时分配的。

让我们通过两种情况更好地理解这一点。

如果我们改变对象本身并将其指向另一个地方或对象,则不会反映更改。如果我们将引用指向不同的地方,则更改将不会反映在 main() 函数中。

请参考下面的代码。

class Object {
  int x;
  Object(int z) {
    x = z;
  }
  Object() {
    x = 0;
  }
}

class Main {
  public static void main(String[] args) {
    // a reference
    Object O = new Object(7);

    // Reference passed and copy created in change()
    change(O);

    // old value
    System.out.println(O.x);
  }
  public static void change(Object O) {
    // reference changed to some other location any changes not reflected
    O = new Object();

    O.x = 8;
  }
}

输出:

7

现在,假设我们不分配对新地址或对象的引用。在这种情况下,结果会被镜像回来:你可以对成员进行修改。如果我们不更改引用以引用另一个对象(或内存位置),则会反映这些更改。

例如,

class Object {
  int x;
  Object(int z) {
    x = z;
  }
  Object() {
    x = 0;
  }
}

class Main {
  public static void main(String[] args) {
    // a reference
    Object O = new Object(7);

    // Reference passed and copy created in change()
    change(O);

    // old value
    System.out.println(O.x);
  }
  public static void change(Object O) {
    O.x = 8;
  }
}

输出:

8