Java中的對象和引用詳解
Java中的對象和引用詳解
在Java中,有一組名詞經(jīng)常一起出現(xiàn),它們就是“對象和對象引用”,很多朋友在初學(xué)Java的時(shí)候可能經(jīng)常會混淆這2個概念,覺得它們是一回事,事實(shí)上則不然。今天我們就來一起了解一下對象和對象引用之間的區(qū)別和聯(lián)系。
1.何謂對象?
在Java中有一句比較流行的話,叫做“萬物皆對象”,這是Java語言設(shè)計(jì)之初的理念之一。要理解什么是對象,需要跟類一起結(jié)合起來理解。下面這段話引自《Java編程思想》中的一段原話:
“按照通俗的說法,每個對象都是某個類(class)的一個實(shí)例(instance),這里,‘類'就是‘類型'的同義詞?!?/span>
從這一句話就可以理解到對象的本質(zhì),簡而言之,它就是類的實(shí)例,比如所有的人統(tǒng)稱為“人類”,這里的“人類”就是一個類(物種的一種類型),而具體到每個人,比如張三這個人,它就是對象,就是“人類”的實(shí)例。
2.何謂對象引用?
我們先看一段話:
“每種編程語言都有自己的數(shù)據(jù)處理方式。有些時(shí)候,程序員必須注意將要處理的數(shù)據(jù)是什么類型。你是直接操縱元素,還是用某種基于特殊語法的間接表示(例如C/C++里的指針)來操作對象。所有這些在 Java 里都得到了簡化,一切都被視為對象。因此,我們可采用一種統(tǒng)一的語法。盡管將一切都“看作”對象,但操縱的標(biāo)識符實(shí)際是指向一個對象的“引用”(reference)?!薄 ?/p>
這段話來自于《Java編程思想》,很顯然,從這段話可以看出對象和對象引用不是一回事,是兩個完全不同的概念。舉個例子,我們通常會用下面這一行代碼來創(chuàng)建一個對象:
Person person = new Person("張三");
有人會說,這里的person是一個對象,是Person類的一個實(shí)例。
也有人會說,這里的person并不是真正的對象,而是指向所創(chuàng)建的對象的引用。
到底哪種說法是對的?我們先不急著糾結(jié)哪種說法是對的,再看兩行代碼:
Person person;
person = new Person("張三");
這兩行代碼實(shí)現(xiàn)的功能和上面的一行代碼是完全一樣的。大家都知道,在Java中new是用來在堆上創(chuàng)建對象用的,如果person是一個對象的話,那么第二行為何還要通過new來創(chuàng)建對象呢?由此可見,person并不是所創(chuàng)建的對象,是什么?上面的一段話說的很清楚,“操縱的標(biāo)識符實(shí)際是指向一個對象的引用”,也就是說person是一個引用,是指向一個可以指向Person類的對象的引用。真正創(chuàng)建對象的語句是右邊的new Person("張三");
再看一個例子:
Person person;
person = new Person("張三");
person = new Person("李四");
這里讓person先指向了“張三”這個對象,然后又指向了“李四”這個對象。也就是說,Person person,這句話只是聲明了一個Person類的引用,它可以指向任何Person類的實(shí)例。這個道理就和下面這段代碼一樣:
int a; a=2; a=3;
這里先聲明了一個int類型的變量a,先對a賦值為2,后面又賦值為3.也就是說int類型的變量a,可以讓它的值為2,也可以為3,只要是合法的int類型的數(shù)值即可。
也就是說,一個引用可以指向多個對象,而一個對象可不可以被多個引用所指呢?答案當(dāng)然是可以的。
比如:
Person person1 = new Person("張三");
Person person2 = person1;
person1和person2都指向了“張三”這個對象。
關(guān)于對象和對象引用的區(qū)別和聯(lián)系暫時(shí)就講這么多了,感興趣的朋友可以查閱相關(guān)文檔和資料?! ?/p>
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
解決spring 處理request.getInputStream()輸入流只能讀取一次問題
這篇文章主要介紹了解決spring 處理request.getInputStream()輸入流只能讀取一次問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Mybatis-Plus將字段設(shè)置為null解決方法
MyBatis-Plus是一個MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增 強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus將字段設(shè)置為null的解決方法的相關(guān)資料,需要的朋友可以參考下2023-04-04
Java中List for循環(huán)的6種寫法總結(jié)(推薦)
下面小編就為大家?guī)硪黄狫ava中List for循環(huán)的6種寫法總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
淺析Spring配置中的classpath:與classpath*:的區(qū)別
這篇文章主要介紹了Spring配置中的"classpath:"與"classpath*:"的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語義
這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語義,理解volatile特性的一個好辦法是把對volatile變量的單個讀/寫,看成是使用同一個鎖對單個讀/寫操作做了同步。下面我們一起進(jìn)入文章看看具體例子吧,需要的小伙伴可以參考下2021-11-11

