1. 程式人生 > >java中,只宣告一個物件不賦值,與宣告一個物件並賦為null,有啥區別?

java中,只宣告一個物件不賦值,與宣告一個物件並賦為null,有啥區別?

轉自:http://www.oschina.net/question/557858_127408

http://zhidao.baidu.com/link?url=rp_hAuPys2vMPnir0t7IFccKVnwEm8zHI7-wEoBSJXw05SAmKHGOObTUQCvVePHhfYz-xs-J_xAy5p2MBZLnE3haVo8HRAYMtTaszeXyQ1y

http://zhidao.baidu.com/link?url=4mHU6Lhh3C3fSJPiS4QumyOo-P469zafSkmJmLCvCdgYisK0sM_4S_kB4sAMn-4rHQzehvOYwtoS4QjJkSgcrK

http://www.zhihu.com/question/21468505

比如:

public MainGame   mMainGame ; 與 public MainGame   mMainGame = null;這兩句的區別?

編譯的時候會不同,未賦值,直接使用編譯時會報錯。

不賦值就不會分配空間,賦值null會分配0大小的初始空間.

區域性變數要賦初始值,全域性變數不需要賦初始值;還有int a=null;這句,應該是Integer a=null;
  1. 如果在類中宣告變數可以不賦值,構造物件時會獲得預設值

  2. 如果在方法中宣告變數,必須賦初始值

作為成員變數來說 int a;預設值為0 ,然而 int a=null;在java這是不正確的;int 為基本型別;
只有 封裝型別 Integer 的預設值 為null 所以 你可以寫成int a ;(0) Integer a;(null)
一個物件只宣告不賦值,則只會在記憶體的棧區建立引用,堆中並無此引用的指向。
而null物件在堆中會被java的垃圾回收機制回收。
java中物件引用放在棧中,物件的例項放於堆中,如果為null,說明只在棧中。 首先要明白,java裡物件傳遞的時候,傳遞的都是引用(也就是物件的地址),這比傳遞整個物件高效的多。而基礎型別,int,double等傳遞的才是值。 比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list裡面。String str = new String("Test"),是開闢記憶體放入了物件,並把它的引用賦給str。 同理,BookInfo bookinfo=null與BookInfo bookinfo=new BookInfo():前者,是聲明瞭一個物件(的引用),jvm並沒有開闢記憶體放入一個物件;而後者,在聲明瞭一個物件的引用後,又把新開闢的沒有儲存任何有效值的物件的地址賦給了他。 作者:林子云 連結:http://www.zhihu.com/question/21468505/answer/18333632 來源:知乎 著作權歸作者所有,轉載請聯絡作者獲得授權。