1、對象的存儲:Java中所有對象的存儲空間都是在堆中分配的,但是這個(gè)對象的引用卻是在堆棧中分配,也就是說在建立一個(gè)對象時(shí)從兩個(gè)地方都分配內(nèi)存,在堆中分配的內(nèi)存實(shí)際建立這個(gè)對象,而在堆棧中分配的內(nèi)存只是一個(gè)指向這個(gè)堆對象的指針(引用)而已。堆的特點(diǎn)是靈活性,但為此犧牲了高效性,可以在運(yùn)行時(shí)動(dòng)態(tài)地分配存儲;堆棧的特點(diǎn)是高效性,但缺乏靈活性,在編譯時(shí)刻必須知道所要分配的空間大小。堆像個(gè)大饅頭,可以根據(jù)你的食量隨便吃,吃飽了算;堆棧像是吃大鍋飯,每個(gè)人都是定食定量的,你必須告訴廚子你的飯量,廚子據(jù)此做飯,然后你們就排隊(duì)打飯吧。它們沒有孰優(yōu)孰劣之分,各自不同特點(diǎn)有不同的應(yīng)用。
2、Java的設(shè)計(jì)在很多方面都基于安全的考慮,減少語言上的混亂,所以喜歡的人很多,屬于大眾情人型。如:運(yùn)行時(shí)數(shù)組下標(biāo)檢查、嚴(yán)格的類型檢查,還有消除變量隱藏語法。
int x = 10;
{
int x = 12; //不合法的!想想看,這種變量隱藏是多么危險(xiǎn),多么不容易察覺,而且多么多余!
}
有人說,Java是C++ 再++ 再--,即Java = C++++--。加入了C++沒有的新特性,消除了C++混亂危險(xiǎn)的特性。《Thinking in Java》中總是拿C++來做對比,開涮,大家別忘了,他也是那本經(jīng)典的《Thinking in C++》的作者!最終投靠到我們Java陣營里來了,呵呵。
3、static方法常常拿來做“牧羊人”的角色,負(fù)責(zé)看護(hù)與其隸屬同一類型的實(shí)例群。看看main方法就可以理解這一含義了。
1、邏輯表達(dá)式的短路會(huì)獲得潛在的性能提升,有點(diǎn)智能了,不會(huì)傻乎乎地一算到底了。利用這點(diǎn)能寫出高效的代碼,如:用||連接的表達(dá)式,把為true可能性大的語句放在前面;用&&連接的表達(dá)式,把為false可能性大的語句放在前面。
2、從按位操作符可以看出Java的歷史痕跡,一個(gè)跨平臺的語言怎么會(huì)牽扯到位操作呢?Java最初是用來開發(fā)嵌入式機(jī)頂盒的。j2me嵌入式開發(fā)也是Java的強(qiáng)項(xiàng)之一,老本行嘛。現(xiàn)在買手機(jī)基本都會(huì)看支持Java嗎?Java無處不在地滲透著。
3、在作者的工具箱中有這樣兩個(gè)工具printBinaryInt()和printBinaryLong(),并且給出了一個(gè)很復(fù)雜的實(shí)現(xiàn)。這里我給用Java的類庫給簡化一下吧。
static void printBinaryInt(String s, int i) {
System.out.println(s + ", int:" + i + ", binary:");
System.out.print(" ");
System.out.print(Integer.toBinaryString(i));
System.out.println();
}
當(dāng)然作者的目的是講解位操作。
4、字符串的連接。
int i=1,j=2,k=3;
System.out.println(i+j+k);
輸出了6。
int i=1,j=2,k=3;
System.out.println(""+i+j+k);
輸出了123。有趣吧?這是因?yàn)閺淖蟮接业倪\(yùn)算順序。