語(yǔ)法糖(Syntactic Sugar),也叫糖衣語(yǔ)法,是英國(guó)計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ)。指的是,在計(jì)算機(jī)語(yǔ)言中添加某種語(yǔ)法,這種語(yǔ)法能使程序員更方便的使用語(yǔ)言開(kāi)發(fā)程序,同時(shí)增強(qiáng)程序代碼的可讀性,避免出錯(cuò)的機(jī)會(huì);但是這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響。
泛型
與C#中的泛型相比,Java的泛型可以算是“偽泛型”了。在C#中,不論是在程序源碼中、在編譯后的中間語(yǔ)言,還是在運(yùn)行期泛型都是真實(shí)存在的。Java則不同,Java的泛型只在源代碼存在,只供編輯器檢查使用,編譯后的字節(jié)碼文件已擦除了泛型類(lèi)型,同時(shí)在必要的地方插入了強(qiáng)制轉(zhuǎn)型的代碼。
源碼:
private void showLists(){
List<String> stringList = new ArrayList<String>();
stringList.add("oliver");
System.out.println(stringList.get(0));
}
編譯后:
private void showLists() {
ArrayList stringList = new ArrayList();
stringList.add("oliver");
System.out.println((String)stringList.get(0));
}
自動(dòng)拆箱/裝箱
自動(dòng)拆箱/裝箱是在編譯期,依據(jù)代碼的語(yǔ)法,決定是否進(jìn)行拆箱和裝箱動(dòng)作。
裝箱過(guò)程:把基本類(lèi)型用它們對(duì)應(yīng)的包裝類(lèi)型進(jìn)行包裝,使基本類(lèi)型具有對(duì)象特征。
拆箱過(guò)程:與裝箱過(guò)程相反,把包裝類(lèi)型轉(zhuǎn)換成基本類(lèi)型。
需要注意的是:包裝類(lèi)型的“==”運(yùn)算在沒(méi)有遇到算數(shù)運(yùn)算符的情況下不會(huì)自動(dòng)拆箱,而其包裝類(lèi)型的equals()方法不會(huì)處理數(shù)據(jù)類(lèi)型轉(zhuǎn)換:
public void packing(){
int a =2 ;
int b =2;
System.out.println( a ==b );
}
==>
public void packing() {
byte a = 2; //沒(méi)有拆裝箱
byte b = 2;
System.out.println(a == b);
}
而:
public void packing(){
Integer a =2 ;
Integer b =2;
System.out.println( a ==b );
}
==>
public void packing() {
Integer a = Integer.valueOf(2); //自動(dòng)裝箱
Integer b = Integer.valueOf(2);
System.out.println(a == b);
}
再;
public void packing(){
Long a =2L ;
long b =2L;
System.out.println( a + b );
}
==>
public void packing() {
Long a = Long.valueOf(2L); //自動(dòng)裝箱
long b = 2L;
System.out.println(a.longValue() + b); //自動(dòng)拆箱
}
注意:
public void intTransgfer(){
int a =2 ;
String a1 = a+"";
transfer0(a);
transfer1(a1);
System.out.println("now a is " + a);
System.out.println("now a1 is " + a1);
}
private void transfer0(int a ){
a = a +1 ;
System.out.println("transfered a is " + a);
}
private void transfer1(String a ){
a = a +1 ;
System.out.println("transfered a1 is " + a);
}
transfered a is 3
transfered a1 is 21
now a is 2
now a1 is 2
從上面看出,a和a1并沒(méi)有發(fā)生改變,說(shuō)明a和a1在內(nèi)存中是常量不會(huì)改變的,除非return 重新指定引用地址。要么封裝在一個(gè)對(duì)象中,依靠對(duì)象的引用地址來(lái)獲取新值。
循環(huán)歷遍
public void foreachs(){
List<Integer> list = new ArrayList<Integer>();
for(Integer num : list){
System.out.println(num);
}
}
==>
public void foreachs() {
ArrayList list = new ArrayList();
Iterator var2 = list.iterator();
while(var2.hasNext()) {
Integer num = (Integer)var2.next();
System.out.println(num);
}
}
條件語(yǔ)句
public void ifs(){
if(true){ //永真
System.out.println("oliver");
}else{
System.out.println("lee");
}
}
==>
public void ifs() {
System.out.println("oliver");
}
在編譯器中,將會(huì)把分支不成立的代碼消除
枚舉
public enum EnumTest {
OLIVER,LEE;
}
==>
public enum EnumTest {
OLIVER,
LEE;
private EnumTest() { //添加了構(gòu)造方法
}
}
內(nèi)部類(lèi)
在jdk8 無(wú)特征..