“嗨,阿米戈,还是我,艾莉。很抱歉一遍又一遍地这么说,但这是 31 世纪地球上的表达习惯。我想为你提供有关引用变量以及将引用变量传递给函数(方法)的更多详细信息。”
“我准备好了。”
“太好了,那我们开始吧。引用变量是所有的非原始变量。这些变量只包含对象引用(指向对象的引用)。”
“原始变量包含值,而引用变量存储对象的引用或 null。我讲得对吗?”
“完全正确。”
“什么是引用?”
“对象与对象引用之间的关系就像一个人与其电话号码之间的关系一样。电话号码不是那个人,但可用于给该人打电话,询问一些信息,管理她或下达命令。引用也用于处理对象。所有对象都使用引用彼此交互。”
“就像他们之间在通电话吗?”
“没错。为原始变量赋值时,将复制该值。如果为引用变量赋值,则只复制对象的地址(电话号码)。对象本身不会被复制。”
“好的,我明白了。”
“引用还有一个好处:你可以将对象引用传递给任意方法,然后方法能够使用该引用,通过调用对象的方法并访问对象内部的数据来修改(更改)对象。”
示例 1
此处的值 m 和 n 不会发生变化。
public class References
{
public static void main (String[] args)
{
int m = 5;
int n = 6;
System.out.println("M=" + m + " N=" + n);
swap(m, n);
System.out.println("M=" + m + " N=" + n);
}
private static void swap(int a, int b)
{
int c = a;
a = b;
b = c;
}
}
|
这就是原因所在。
此代码类似于左侧的代码
public class References
{
public static void main (String[] args)
{
int m = 5;
int n = 6;
System.out.println("M=" + m + " N=" + n);
int a = m, b = n;
int c = a;
a = b;
b = c;
System.out.println("M=" + m + " N=" + n);
}
}
|
“只是把值 5 (m) 和 6 (n) 分别赋给变量 a 和 b;a 和 b 完全不知道(也不会以任何方式影响)m 和 n。”
“说实话,我现在发现我完全没听懂。你能再给我举几个例子吗?”
“使用对象引用,我们可以完成以下操作:”
示例 2
在此代码中,对象的数据将发生变化
public class Primitives
{
public static void main(String[] args)
{
Student jen = new Student();
jen.name = "珍";
jen.age = 21;
Student beth = new Student();
beth.name = "贝丝";
beth.age = 15;
System.out.println("珍的年龄为 " + jen.age);
System.out.println("贝丝的年龄为 " + beth.age);
ageSwap(jen, beth);
System.out.println("珍的年龄为 " + jen.age);
System.out.println("贝丝的年龄为 " + beth.age);
}
private static void ageSwap(Student a,
Student b)
{
int c = a.age;
a.age = b.age;
b.age = c;
}
static class Student
{
String name;
int age;
}
}
|
这就是原因所在。
此代码类似于左侧的代码
public class Primitives
{
public static void main(String[] args)
{
Student jen = new Student();
jen.name = "珍";
jen.age = 21;
Student beth = new Student();
beth.name = "贝丝";
beth.age = 15;
System.out.println("珍的年龄为 " + jen.age);
System.out.println("贝丝的年龄为 " + beth.age);
Student a = jen, b = beth;
int c = a.age;
a.age = b.age;
b.age = c;
System.out.println("珍的年龄为 " + jen.age);
System.out.println("贝丝的年龄为 " + beth.age);
}
static class Student
{
String name;
int age;
}
}
|
“分别将对 jen 和 beth 的引用赋给变量 a 和 b;a 和 b 更改对象 jen 和 beth 内部的值。”
“你可以在一个类的内部声明其他类,对吗?太酷了!”
“但是我对其他所有内容还是不太理解。”
“总有一天你会彻底搞明白的。”
GO TO FULL VERSION