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

!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM