Java中的對象、對象引用及對象引用分類

在Java中,有一組名詞經常一起出現,它們就是“對象和對象引用”,很多朋友在初學Java的時候可能經常會混淆這2個概念,看完本文,不斷能讓你明白,這兩詞意思,還能進一步搞明白一些原理

一、對象

  在Java中有一句比較流行的話,叫做“萬物皆對象”,這是Java語言設計之初的理念之一。要理解什麼是對象,需要跟類一起結合起來理解。按照通俗的說法,每個對象都是某個類(class)的一個實例(instance),這裏,‘類’就是‘類型’的同義詞,類是抽象的,偏虛,而對象就是比較具體,偏實,比如那天你真看到了外星人,然後向身邊的朋友講述你外星人什麼樣的,朋友從來沒見過,聽起來雲霧裏的,很難理解,如果你說那個大家都認識的某某,可以看作外星人,那麼某某就是外星的對象了

  再打個比方,比如所有的人統稱爲“人類”,這裏的“人類”就是一個類(物種的一種類型),而具體到每個人,比如張三這個人,它就是對象,就是“人類”的實例。

二、對象引用

 “每種編程語言都有自己的數據處理方式。有些時候,程序員必須注意將要處理的數據是什麼類型。你是直接操縱元素,還是用某種基於特殊語法的間接表示(例如C/C++裏的指針)來操作對象。所有這些在 Java 裏都得到了簡化,一切都被視爲對象。因此,我們可採用一種統一的語法。儘管將一切都“看作”對象,但操縱的標識符實際是指向一個對象的“引用”(reference)。”  

  舉個例子,我們通常會用下面這一行代碼來創建一個對象:

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都指向了“張三”這個對象

三,對象引用分類及應用場景

  在jvm中,一個對象如果不再被使用就會被當做垃圾給回收掉,判斷一個對象是否是垃圾,通常有兩種方法:引用計數法和可達性分析法。不管是哪一種方法判斷一個對象是否是垃圾的條件總是一個對象的引用是都沒有了。

JDK.1.2 之後,Java 對引用的概念進行了擴充,將引用分爲了:強引用、軟引用、弱引用、虛引用4 種。

3.1 強引用

   如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。比如String str = "hello"這時候str就是一個強引用。如果想要中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值爲null,這樣一來的話,JVM在合適的時間就會回收該對象。

3.2 軟引用

   內存足夠的時候,軟引用對象不會被回收,只有在內存不足時,系統則會回收軟引用對象,如果回收了軟引用對象之後仍然沒有足夠的內存,纔會拋出內存溢出異常。可用於圖片緩存中,內存不足時系統會自動回收不再使用的Bitmap

3.3 弱引用

   如果一個對象具有弱引用,在垃圾回收時候,一旦發現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。同樣可用於圖片緩存中,這時候只要Bitmap不再使用就會被回收

3.4 虛引用

  虛引用是Java中最“弱”的引用,在任何時候都可能被垃圾回收器回收。通過它甚至無法獲取被引用的對象,它存在的唯一作用就是當它指向的對象回收時,它本身會被加入到引用隊列中,這樣我們可以知道它指向的對象何時被銷燬。 如果一個對象具有虛引用,就相當於沒有引用,在任何時候都有可能被回收。使用虛引用的目的就是爲了得知對象被GC的時機,所以可以利用虛引用來進行銷燬前的一些操作,比如說資源釋放等。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章