1) String str;
棧內存開闢一塊空間,存儲str引用
2) String str = null;
棧內存開闢一塊空間,儲存str引用,
堆內存中開闢一塊空間,
str指向那塊空的內存的地址
3)String str = new String("String");
棧內存開闢一塊空間,儲存str引用,
先在內存的常量池中查詢是否存在“String”,如存在,則將該塊空間複製一份到內存的堆區間上,並將str指向該塊區域,如不存在,則先在常量池中創建 一個“String”,然後將其複製到堆,再令str指向它。就是說無論如何都必然會創建一個新的String字符串對象,不管你字符串池有沒有
注意:
初始化一個局域變量爲null,是爲了在非法使用此變量時報空指針異常,容易找到錯誤發生的地方,只是一個習慣,不是必須