變數和物件的區別是什麼意思

  物件和變數這兩個概念莫要搞亂,頸是頸,椎是椎,雖然兩者都對應著一塊記憶體,但是從不同的角度去理解記憶體就會產生不同的意義。下面就讓小編來為大家介紹一下吧,希望大家喜歡。

  變數與物件

  變數:所謂變數就是一種定義,通過定義編譯器將會開闢一段空間,並將這段記憶體空間和這個變數的名字捆綁在一起。從這個意思去理解,其實說白了:變數名就是記憶體在程式碼中視覺化的一個符號。也就是說,如int a,a只是記憶體中某段地址在程式碼中視覺化的一個符號,a本身作為符號並不佔用空間,佔用空間的是a所對應著的那個變數,通過a這個符號我們可以引用到該變數在記憶體中的位置。就好比是人和名字的關係,人作為一個真真正正的實體,是佔用地球的物理空間的,是一個真實的存在,而這個人的名字只是代表了這個人的一個符號,本身並沒有佔用地球的物理空間,只是在他媽把他生下來的時候,把人這個實體和名字捆綁在了一起,因此,我們引用這個人的名字的時候,就等於我們找到了這個人。

  物件:物件就是記憶體中一段有型別的區域。從這句話的描述上來看,物件至於變數,似乎更關注的是這對記憶體的型別,而不是名字。不能說變數就是物件,或者物件就是變數,嚴格來說,物件就是用來描述變數的。一點佐證是,C++中的臨時變數的概念,如傳參時生成的臨時變數,該變數在記憶體中存在,但是是沒有名字的,因此在程式碼中無法視覺化,我們就無法通過名字去引用這個臨時變數。

  兩者的區別與聯絡

  從上面的兩個描述中我們可以看到,兩者都是用來描述一段記憶體的,但是是從不同的角度去描述:

  變數更強調的是變數名這個符號的含義,更強調名字與記憶體的聯絡,而不必關注這段記憶體是什麼型別,有多少位元組長度,只關注這個變數名a對應著某段記憶體。

  而物件的描述更強調的是記憶體的型別而不在乎名字,也就是說,從物件的角度去看記憶體,就需要清楚這段記憶體的位元組長度等資訊,而不關注這個物件在代

  舉例:

  int a;

  如果我們說a是個變數,那我們關注的只是a這個名字對應著一塊記憶體,當我們引用a時,我們能明確的知道我們引用的是a這個名字所對應的記憶體空間,而不是別的,也不去關注這個a的記憶體是個int啊char啊之類的什麼型別。如果我們說a是個物件,則我們需要知道這個物件具體是什麼型別,當我們引用並操作a的時候,就能根據型別資訊做一些符合型別語義的操作,而不是暴力訪問記憶體,任意解析記憶體中的資料碼中是否有一個變數名來引用到這段記憶體。

  物件與物件變數

  要想使用物件,就必須首先構造物件,並指定其初始狀態。然後,對物件施加方法。

  在Java程式設計語言中,使用構造器***constructor***構造新例項。構造器是一種特殊的方法,用來構造並初始化物件。下面看一個例子。在標準Java類庫中包含一個Data類。它的物件將描述一個時間點,例如"December 31,1999,23:59:59 GMT".

  構造器的名字應該與類名相同,因此Data類的構造器名為Data。要想構造一個Data物件,需要在構造器前面加上new操作符,如下所示:

  new Data******

  這個表示式構造了一個新物件。這個物件被初始化為當前的日期和時間。

  如果需要的話,也可以將這個物件傳遞給一個方法:

  System.out.println***new Data*********;

  相反,也可以將一個方法應用於剛剛構造的物件上。Data類中有一個toString方法。這個方法將返回日期的字串描述。下面的語句可以說明如何將toString方法應用於新構造的Data物件上。

  String s=new Data******.toString******;

  在這兩個例子中,構造的物件僅使用了一次。通常,希望構造的物件可以被多次使用,因此,需要將物件存放在一個變數中;

  Data birthday=new Data******;

  在物件與物件變數之間存在著一個重要的區別。例如,語句

  Data deadline;//deadline doesn't refer to any object

  定義了一個物件變數deadline,它可以引用Data型別的物件。但是,一定要認識到:變數deadline不是一個物件,實際上也沒有引用物件。此時,不能將任何Data方法應用於這個變數上。語句

  s=deadline.toString******;

  將產生編譯錯誤。。

  必須首先初始化變數deadlin.這裡有兩個選擇。當然可以用新構造的物件初始化這個變數:

  deadline=new Data******;

  或者讓這個變數引用一個已存在的物件:

  deadline=birthday;

  選擇,這個兩個變數引用同一個物件

  一定要認識到:一個物件變數並沒有實際包含一個物件,而僅僅引用一個物件。

  在Java中,任何物件變數的值都是對儲存在另外一處的一個物件的引用。new操作符的返回值夜是一個引用。下列語句:

  Data deadline=new Data******;

  有兩個部分。表示式new Data******構造了一個Data型別的物件,並且它的值是對新建立物件的引用。這個引用被儲存在變數deadli中。

  可以顯式地將物件變數設定為空***null***,表明和這個物件變數目前並沒有引用任何物件。

  deadline=null;

  ...

  if***deadline!=null***

  System.out.println***deadline***;

  如果將一個方法應用於一個值為null的物件上,就會產生執行錯誤。

  birthday=null;

  String s=birthday.toString******;//runtime error!

  變數不會自動地初始化為null,而必須對他們進行初始化,呼叫new或將它們設定為null。

猜你喜歡