在這里引用一個基礎的面試題:
以下幾種定義變量的方式有什么分別?:
1、 String str;
2、 String str=Null;
3、 String str="";
4、 String str="abc";
5、 String str= new ("abc");
相信有很多工作多年的程序員並不能完全,或者說是准確的講清楚上面這個問題,這些基本的知識並不難,只是在實用主義的大旗下大部分的coder缺少沉淀和思考,以至於在一些基礎知識的掌握還不如畢業生,但畢業生也有自己的困境,書本上的東西畢竟有局限性。還好的是你看到這篇與實用主義對立的隨筆文章會對你有所幫助。
● 對“定義”的解釋:
在java語言中變量或常量的基本定義方式為:
類 變量名= new類();
或
基本數據類型 變量名 = 值;
舉個例子,描述用戶的類User:
public class User {
private String name;
private Integer age;
}
現在定義一個變量名為user的User類的對象:User user = new User();
當然我們也可以在基本定義方式上增加修飾符:private、public等,也可以在()傳入構造函數的參數;
這里需要說明的是:Java的數據類型有基本數據類型(數值型、字符型、布爾型)、引用數據類型(類、接口、數組)
其實上面這個基本的變量定義方式包含了4個動作:變量的聲明、引用、創建、初始化。
● 對“聲明”的解釋:
變量的聲明方式:User user;聲明的特點是該變量user並沒有引用,系統會給它一個默認的引用:null;
● 對“引用”的解釋:
變量名 = 對象;這個=的過程就是引用;
例:User user2 = user;
這引用表示:變量user2引用的對象與user引用的對象為同一個。
● 對“創建”的解釋
new 類();這個new的動作即為創建對象;
● 對“賦值”的解釋
賦值的概念其實基本同引用,所不同是賦值是針對基本數據類型的叫法,引用是針對引用數據類型來講。
例:int n = 100;
定義一個int 類型的變量 n並賦值為100;
● 對“初始化”的解釋
在變量定義時的賦值或引用即為初始化,也可以理解為第一次賦值或引用的過程。
通過上面的解釋我們再來回答這個基礎的面試題:
1、 聲明了一個變量名為str的類String的變量;
2、 聲明了一個變量名為str的類String的變量,它的初始化引用為空;
3、 聲明了一個變量名為str的類String的變量,它的初始化引用為一個值是""(空串)的String對象;
4、 聲明了一個變量名為str的類String的變量,它的初始化引用為一個值是"abc"的String對象;
5、 聲明了一個變量名為str的類String的變量,它的初始化引用為一個新創建的值是"abc"的String對象;
1和2的區別在於:2如果是在局部變量的情況下會報編譯錯誤:the local variable b may not have been initialized(局部變量沒有被初始化)
2和3的區別在於2的引用是空,也就是在堆(heap)內存中無對應的內存空間,3是指向一個在堆內存中值為“”的一個內存空間;
3和4的區別在於引用對象不同,不同對象對應的內存空間不同;
但是如果:
String a = "", b = "";
String c = "abc"; d = "abc";
這時侯a和b引用的內存地址為同一個,c和d引用的內存地址也為同一個;
這是因為在 =(引用)的過程中,系統會在堆(heap)內存的變量池中查找是否有內存空間存儲對象值為"abc"的內存空間,有則引用這個空間。
5與4的別區在於在通過new關鍵字,系統不會判斷堆(heap)內存是否存在相同對象的內存空間,而是直接新申請內存空間創建一個新的對象。
Java架構技術交流QQ群:4187754,歡迎一起學習交流!