引用变量

Java 语法
第 2 级 , 课程 6
可用

“嗨,阿米戈,还是我,艾莉。很抱歉一遍又一遍地这么说,但这是 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) 分别赋给变量 abab 完全不知道(也不会以任何方式影响)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 内部的值。”

“你可以在一个类的内部声明其他类,对吗?太酷了!”

“但是我对其他所有内容还是不太理解。”

“总有一天你会彻底搞明白的。”

评论 (41)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Lynnn. 级别 3,Guangdong,China
20 八月 2023
示例1和示例2的内存解析(根据在其他地方自学内容画的,如有误还请大家帮忙指出。做个笔记以防以后忘了,也希望能帮助大家理解课程的例子。如果图片加载不出来,点击文字下方左下角空白部分即可打开图片)
冲击 级别 18,Seattle,China
25 十一月 2023
你是个好人啊🥰🥰
Qin-1999 级别 22
21 十二月 2023
hhhhhhhh,到处都有你
冲击 级别 18,Seattle,China
24 十二月 2023
最近在学java 不然项目上不了手
ForestHo 级别 14,Washington,China
25 四月 2024
这是什么软件绘制的
Henry Lee 级别 6,Tokyo,Japan
31 七月 2023
精辟的。
Ywuuu 级别 8,San Diego
20 七月 2023
原始类型赋值时复制值,引用类型赋值时复制引用。所以在调用函数并传参时,前者对复制过来的值进行处理,则被复制的值不受影响。后者对复制过来的引用进行处理,直接影响被引用的对象。引用类型使得参数传递时多了一层“引用联系”。
テンペストリムル(YKDZ) 级别 20,Guangzhou,China
29 六月 2023
int类型的变量m和n是原始变量,直接储存值,值被传递给a与b后修改a和b不会影响m和n本身 Student类型的变量jen和beth储存的是对象的引用(地址),地址被传递给a和b后a和b拥有与jen和beth同样的地址,修改a和b相当于修改jen和beth
z18335776829 级别 19,China,China
1 三月 2023
"阿米戈" 在 示例1 后说: "说实话,我现在发现我完全没听懂。你能再给我举几个例子吗?" 证明示例1没听懂 我认为应该详细讲一遍告诉初学者 示例1 发生了什么 而不是直接抛出 示例2 去讲解 实例对象的 地址值与值之间的关系
Rick Huang 级别 3,Taiwan, Province of China
18 十一月 2022
what is SWAP functional ?
Anonymous #11179906 级别 7,Пекин,China
15 十一月 2022
原始变量是指JAVA的八种基本数据类型存储的都是实际的值。引用变量存储的是对象的引用(即对象在内存中的地址)。 值和引用存储在 stack(栈)中,而对象存储在 heap(堆)中。 栈的优势是,存取速度比堆要快。栈中的数据大小与生存周期必须是确定的。堆的优势是可以动态地分配内存大小,生存周期也不必事先告诉编译器,Java 的垃圾回收器会自动收走那些不再使用的数据。但由于要在运行时动态分配内存,存取速度较慢。 值传递过程中,数值被其他变量复制并修改后,不会影响原变量中存储的数值。 引用传递过程中,对象内存储的数据被复制替换或修改后,原变量会更改为替换或修改后的数据。
元. 级别 26,Taipei,Taiwan, Province of China
22 九月 2022
抱歉 我不太懂最後幾行的類有什麼意義 static class Student { String name; int age; }
小明 级别 9,China,China
14 十月 2022
定义Student的name属性和age属性
afei1234567 级别 28,China,China
14 十月 2022
jen 和 beth这俩实例对象的类,你没有这个类就不能新建jen 和 beth 这俩对象。
2 七月 2022
值传递和地址传递的区别, 值传递: 复制文件,打开修改--->复制后的文件,对原文件无影响。 地址传递:文件快捷方式,打开修改--->原始文件,对原文件有影响。
为何而活liker 级别 3,China,China
21 八月 2022
精辟!
熊熊不吃鱼 级别 2,Fujian,中国
27 二月 2022
楼下正解