變量和對象的區(qū)別是什么意思
變量和對象的區(qū)別是什么意思
對象和變量這兩個概念莫要搞亂,頸是頸,椎是椎,雖然兩者都對應著一塊內(nèi)存,但是從不同的角度去理解內(nèi)存就會產(chǎn)生不同的意義。下面就讓學習啦小編來為大家介紹一下吧,希望大家喜歡。
變量與對象
變量:所謂變量就是一種定義,通過定義編譯器將會開辟一段空間,并將這段內(nèi)存空間和這個變量的名字捆綁在一起。從這個意思去理解,其實說白了:變量名就是內(nèi)存在代碼中可視化的一個符號。也就是說,如int a,a只是內(nèi)存中某段地址在代碼中可視化的一個符號,a本身作為符號并不占用空間,占用空間的是a所對應著的那個變量,通過a這個符號我們可以引用到該變量在內(nèi)存中的位置。就好比是人和名字的關(guān)系,人作為一個真真正正的實體,是占用地球的物理空間的,是一個真實的存在,而這個人的名字只是代表了這個人的一個符號,本身并沒有占用地球的物理空間,只是在他媽把他生下來的時候,把人這個實體和名字捆綁在了一起,因此,我們引用這個人的名字的時候,就等于我們找到了這個人。
對象:對象就是內(nèi)存中一段有類型的區(qū)域。從這句話的描述上來看,對象至于變量,似乎更關(guān)注的是這對內(nèi)存的類型,而不是名字。不能說變量就是對象,或者對象就是變量,嚴格來說,對象就是用來描述變量的。一點佐證是,C++中的臨時變量的概念,如傳參時生成的臨時變量,該變量在內(nèi)存中存在,但是是沒有名字的,因此在代碼中無法可視化,我們就無法通過名字去引用這個臨時變量。
兩者的區(qū)別與聯(lián)系
從上面的兩個描述中我們可以看到,兩者都是用來描述一段內(nèi)存的,但是是從不同的角度去描述:
變量更強調(diào)的是變量名這個符號的含義,更強調(diào)名字與內(nèi)存的聯(lián)系,而不必關(guān)注這段內(nèi)存是什么類型,有多少字節(jié)長度,只關(guān)注這個變量名a對應著某段內(nèi)存。
而對象的描述更強調(diào)的是內(nèi)存的類型而不在乎名字,也就是說,從對象的角度去看內(nèi)存,就需要清楚這段內(nèi)存的字節(jié)長度等信息,而不關(guān)注這個對象在代
舉例:
int a;
如果我們說a是個變量,那我們關(guān)注的只是a這個名字對應著一塊內(nèi)存,當我們引用a時,我們能明確的知道我們引用的是a這個名字所對應的內(nèi)存空間,而不是別的,也不去關(guān)注這個a的內(nèi)存是個int啊char啊之類的什么類型。如果我們說a是個對象,則我們需要知道這個對象具體是什么類型,當我們引用并操作a的時候,就能根據(jù)類型信息做一些符合類型語義的操作,而不是暴力訪問內(nèi)存,任意解析內(nèi)存中的數(shù)據(jù)碼中是否有一個變量名來引用到這段內(nèi)存。
對象與對象變量
要想使用對象,就必須首先構(gòu)造對象,并指定其初始狀態(tài)。然后,對對象施加方法。
在Java程序設(shè)計語言中,使用構(gòu)造器(constructor)構(gòu)造新實例。構(gòu)造器是一種特殊的方法,用來構(gòu)造并初始化對象。下面看一個例子。在標準Java類庫中包含一個Data類。它的對象將描述一個時間點,例如"December 31,1999,23:59:59 GMT".
構(gòu)造器的名字應該與類名相同,因此Data類的構(gòu)造器名為Data。要想構(gòu)造一個Data對象,需要在構(gòu)造器前面加上new操作符,如下所示:
new Data()
這個表達式構(gòu)造了一個新對象。這個對象被初始化為當前的日期和時間。
如果需要的話,也可以將這個對象傳遞給一個方法:
System.out.println(new Data());
相反,也可以將一個方法應用于剛剛構(gòu)造的對象上。Data類中有一個toString方法。這個方法將返回日期的字符串描述。下面的語句可以說明如何將toString方法應用于新構(gòu)造的Data對象上。
String s=new Data().toString();
在這兩個例子中,構(gòu)造的對象僅使用了一次。通常,希望構(gòu)造的對象可以被多次使用,因此,需要將對象存放在一個變量中;
Data birthday=new Data();
在對象與對象變量之間存在著一個重要的區(qū)別。例如,語句
Data deadline;//deadline doesn't refer to any object
定義了一個對象變量deadline,它可以引用Data類型的對象。但是,一定要認識到:變量deadline不是一個對象,實際上也沒有引用對象。此時,不能將任何Data方法應用于這個變量上。語句
s=deadline.toString();
將產(chǎn)生編譯錯誤。。
必須首先初始化變量deadlin.這里有兩個選擇。當然可以用新構(gòu)造的對象初始化這個變量:
deadline=new Data();
或者讓這個變量引用一個已存在的對象:
deadline=birthday;
選擇,這個兩個變量引用同一個對象
一定要認識到:一個對象變量并沒有實際包含一個對象,而僅僅引用一個對象。
在Java中,任何對象變量的值都是對存儲在另外一處的一個對象的引用。new操作符的返回值夜是一個引用。下列語句:
Data deadline=new Data();
有兩個部分。表達式new Data()構(gòu)造了一個Data類型的對象,并且它的值是對新創(chuàng)建對象的引用。這個引用被存儲在變量deadli中。
可以顯式地將對象變量設(shè)置為空(null),表明和這個對象變量目前并沒有引用任何對象。
deadline=null;
...
if(deadline!=null)
System.out.println(deadline);
如果將一個方法應用于一個值為null的對象上,就會產(chǎn)生運行錯誤。
birthday=null;
String s=birthday.toString();//runtime error!
變量不會自動地初始化為null,而必須對他們進行初始化,調(diào)用new或?qū)⑺鼈冊O(shè)置為null。
猜你喜歡