首先將所有的variable分成三類
第一類 基本類型(primitive types), 共有8種柴我,即int, short, long, byte, float, double, boolean, char
第二類 String(String是一個特殊的包裝類數(shù)據(jù))
第三類 其他包裝類數(shù)據(jù)
基本類型
int a = 3;
int b = 3;
編譯器先處理int a = 3;首先它會在棧中創(chuàng)建一個變量為a的引用余黎,然后查找有沒有字面值為3的地址疾宏,沒找到浸颓,就開辟一個存放3這個字面值的地址,然后將a指向3的地址笛丙。接著處理int b = 3;在創(chuàng)建完b的引用變量后假颇,由于在棧中已經(jīng)有3這個字面值胚鸯,便將b直接指向3的地址。這樣笨鸡,就出現(xiàn)了a與b同時均指向3的情況姜钳。
包裝類數(shù)據(jù)
就是在stack里面建一個地址然后指向heap(其實我一直好奇它是如何指向的)
特殊包裝類數(shù)據(jù) String
String是一個特殊的包裝類數(shù)據(jù)。即可以用String str = new String("abc");的形式來創(chuàng)建形耗,也可以用String str = "abc";
假如我們是按照String str =new String (“abc”)來的話 那等于將它當作一個包裝類數(shù)據(jù)
如果我們用的是String str = "abc"; 那么Java具體是這樣執(zhí)行的
- 先定義一個名為str的對String類的對象引用變量:String str哥桥;
- 在棧中查找有沒有存放值為"abc"的地址,如果沒有趟脂,則開辟一個存放字面值為"abc"的地址泰讽,接著創(chuàng)建一個新的String類的對象o,并將o 的字符串值指向這個地址,而且在棧中這個地址旁邊記下這個引用的對象o已卸。如果已經(jīng)有了值為"abc"的地址佛玄,則查找對象o,并返回o的地址累澡。
- 將str指向?qū)ο髈的地址梦抢。值得注意的是,一般String類中字符串值都是直接存值的愧哟。但像String str = "abc"奥吩;這種場合下,其字符串值卻是保存了一個指向存在棧中數(shù)據(jù)的引用蕊梧!
String a = "abc";
String b = new String "abc";
String c = "abc";
System.out.println(a == b); //false
System.out.println(b == c); //false
System.out.println(a == c); //true