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