1. 程式人生 > >淺談Java中的物件和物件的引用

淺談Java中的物件和物件的引用

淺談java中的物件和引用

文章轉載出處:https://www.cnblogs.com/dolphin0520/p/3592498.html

在Java中,有一組名詞經常一起出現,它們就是“物件和物件引用”,很多朋友在初學Java的時候可能經常會混淆這2個概念,覺得它們是一回事,事實上則不然。今天我們就來一起了解一下物件和物件引用之間的區別和聯絡

1.何謂物件?
 在Java中有一句比較流行的話,叫做“萬物皆物件”,這是Java語言設計之初的理念之一。要理解什麼是物件,需要跟類一起結合起來理解。下面這段話引自《Java程式設計思想》中的一段原話:
  “按照通俗的說法,每個物件都是某個類(class)的一個例項(instance),這裡,‘類’就是‘型別’的同義詞。”
  從這一句話就可以理解到物件的本質,簡而言之,它就是類的例項,比如所有的人統稱為“人類”,這裡的“人類”就是一個類(物種的一種型別),而具體到每個人,比如張三這個人,它就是物件,就是“人類”的例項。
  
2.何謂物件引用?


我們先看一段話:
  “每種程式語言都有自己的資料處理方式。有些時候,程式設計師必須注意將要處理的資料是什麼型別。你是直接操縱元素,還是用某種基於特殊語法的間接表示(例如C/C++裡的指標)來操作物件。所有這些在 Java 裡都得到了簡化,一切都被視為物件。因此,我們可採用一種統一的語法。儘管將一切都“看作”物件,但操縱的識別符號實際是指向一個物件的“引用”(reference)。”  
  這段話來自於《Java程式設計思想》,很顯然,從這段話可以看出物件和物件引用不是一回事,是兩個完全不同的概念。舉個例子,我們通常會用下面這一行程式碼來建立一個物件:

Person person = new Person("張三");

有人會說,這裡的person是一個物件,是Person類的一個例項。
也有人會說,這裡的person並不是真正的物件,而是指向所建立的物件的引用。
到底哪種說法是對的?我們先不急著糾結哪種說法是對的,再看兩行程式碼:

Person person;
person = new Person("張三");

這兩行程式碼實現的功能和上面的一行程式碼是完全一樣的。大家都知道,在Java中new是用來在堆上建立物件用的,如果person是一個物件的話,那麼第二行為何還要通過new來建立物件呢?由此可見,person並不是所建立的物件,是什麼?上面的一段話說的很清楚,“操縱的識別符號實際是指向一個物件的引用”,也就是說person是一個引用,是指向一個可以指向Person類的物件的引用。真正建立物件的語句是右邊的new Person(“張三”);
再看一個例子:

Person person;
person = new Person("張三");
person = new Person("李四");

這裡讓person先指向了“張三”這個物件,然後又指向了“李四”這個物件。也就是說,Person person,這句話只是聲明瞭一個Person類的引用,它可以指向任何Person類的例項。這個道理就和下面這段程式碼一樣:

int a;
a=2;
a=3;

這裡先聲明瞭一個int型別的變數a,先對a賦值為2,後面又賦值為3.也就是說int型別的變數a,可以讓它的值為2,也可以為3,只要是合法的int型別的數值即可。
  也就是說,一個引用可以多次被重新指向不同的物件,但最後那個引用還只是指向一個或者零個物件,而一個物件是否可以有多個引用指向呢?答案當然是可以的。
  比如:

Person person1 = new Person("張三");
Person person2 = person1;

person1和person2都指向了“張三”這個物件。

以上就是關於java中物件和物件引用的理解。