• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
火磷
Memory will fade,but not notes.
博客园    首页    新随笔    联系   管理    订阅  订阅
java 对象、对象引用

1.简介

在Java中对象和对象引用是两个容易混淆的概念,下面通过代码示例进行详细的说明。

2.含义

为方便说明,首先定义一个Person类,它有name和age两个属性。

 1 public class Person {
 2 
 3     private String name;
 4     private int age;
 5     
 6     public Person(String name, int age){
 7         this.name =name;
 8         this.age = age;
 9     }
10 }

现在来创建一个对象:

Person p1 = new Person("Wang", 12);

我们通常把上述代码称之为创建一个对象,那么如何正确区分p1、new Person("Wang", 12)以及它们之间的关系呢?下面做进一步拆分:

1 Person p1;
2 p1 = new Person("Wang", 12);

上面分开的两条语句有助于我们的理解,我们知道在Java中使用new关键字创建对象,所以说new Person("Wang", 12)是在创建对象,或

者可以说它是对象本身;那么第1条语句中的p1表示什么呢,在Java中我们称之为对象引用变量,完整的表述是”p1是一个指向Person对象

的引用(变量)“。

3.关系

在理解对象、对象引用后,我们在进一步说明它们之间的映射关系。

1 Person p2;
2 p2 = p1;
3 p2 = new Person("Li", 11);

具体说明如下:

第1行创建一个Person类的对象引用p2,它指向NULL。

第2行将对象引用p1所指向的对象(对象的地址)复制给p2,注意此时这两个对象的引用p1和p2都指向同一个对象”Wang“,修改任意一

个都会相应地导致另一个参数改变。

第3行将对象引用p2指向了一个新对象”Li“,此时p1和p2指向了不同的对象。

注:通过上述关系说明可知,一个对象可以拥有多个引用,一个引用只能同时绑定0个或1个对象。

4.传参

在理解对象、对象引用之间的关系后,再来看看Java中的传参问题。在函数中如果传入的是基本类型,将会得到此基本类型的一份拷贝;

如果传入的是传递引用,就得到该引用的拷贝。代码示例如下:

 1 public class Test {
 2     private int i, j;
 3 
 4     private void test_m1(Test a) {
 5         Test b = new Test();
 6         b.i = 1;
 7         b.j = 2;
 8         a = b;
 9     }
10 
11     private void test_m2(Test a) {
12         a.i = 1;
13         a.j = 2;
14     }
15 
16     public static void main(String[] args) {
17         Test t = new Test();
18         t.i = 5;
19         t.j = 6;
20         System.out.println("t.i   =   " + t.i + "   t.j=   " + t.j); // 5,6
21 
22         t.test_m1(t);
23         System.out.println("t.i   =   " + t.i + "   t.j=   " + t.j); // 5,6
24 
25         t.test_m2(t);
26         System.out.println("t.i   =   " + t.i + "   t.j=   " + t.j); // 1,2
27     }
28 }

在第22行执行函数test_m1(t),该函数的参数引用a拷贝了引用t,即引用a获取了对象地址,a和t指向了同一个对象(i=5, j=6)。在函数

中新建了一个对象(i=1, j=2),并且使用引用b指向它。最后让引用a拷贝引用b,即引用a指向了新对象,但是引用t未发生变化,此时它

仍然指向原先的对象。

 在第25行执行函数test_m2(t),此时该函数的引用a拷贝了引用t,即引用a获取了对象地址,a和t指向了同一个对象(i=5, j=6)。此时通过

引用a修改对象时(i=1, j=2),由于引用t仍然指向该对象,所以此时i和j的值发生变化。

5.参考文献

https://www.cnblogs.com/dolphin0520/p/3592498.html

https://www.iteye.com/blog/zwmf-1738574

!!!

 

posted on 2020-02-26 22:40  火磷  阅读(6637)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3