• 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

    !!!

  • 相关阅读:
    架构与思维:设计容量,到底有多重要 ?
    MySQL全面瓦解25:构建高性能索引(案例分析篇)
    MySQL全面瓦解24:构建高性能索引(策略篇)
    MySQL全面瓦解23:MySQL索引实现和使用
    MySQL全面瓦解22:索引的介绍和原理分析
    C#9.0:Records
    C#9.0:Improved Pattern Matching
    C#9.0:Top-Level Programs
    C#9.0:Init
    MySQL全面瓦解21(番外):一次深夜优化亿级数据分页的奇妙经历
  • 原文地址:https://www.cnblogs.com/jfl-xx/p/12369647.html
Copyright © 2020-2023  润新知