亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java糖衣語法(Syntactic Sugar)詳解

2019-11-14 11:26:20
字體:
來源:轉載
供稿:網友

糖衣語法,也叫做語法糖。最開始是英國計算機學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語。語法糖是指某一類語法,這類語法通過一些簡單的包裝,讓代碼變得簡潔、可讀性好,并在編譯時通過“解語法糖”的方式,在功能不變的情況下用簡單語法來通過編譯。 正如其名,語法糖就像是一層糖衣,通過這層糖衣讓代碼變得簡潔。虛擬機并不支持這類語法,在虛擬機運行之前,這類語法就會被編譯成更通俗的簡單的語法,但功能不變。 在java中,常用的語法糖有以下這些:

泛型與類型擦除 自動裝箱和拆箱 foreach循環 變長參數 條件編譯 內部類 枚舉類和switch 斷言語句

下面我們就一個個的來分別看一下每個語法糖的功能用法和他實際的原理

(一)泛型與類型擦除

在java的虛擬機中沒有泛型類,每一個類型在java虛擬機中都有一個相對應的基本類型。下面是一篇泛型及原理的解析。

泛型類詳解傳送門:http://blog.csdn.net/quinnnorris/article/details/54808172

(二)自動裝箱和拆箱

在java代碼中,很多時候我們不能直接使用八個基本類型,而是要使用他們對應的包裝類(也叫包裝器 wrapper)這些對象包裝類的名字也很容易記憶:Integer、Long、Byte、Double、Float、Character、Boolean、Short。最簡單的例子就是泛型中,因為擦除后無法將基本類型存入Object中,所以必須使用包裝類作為類型參數:

List<int> list = new ArrayList<>();//errorList<Integer> list = new ArrayList<>();//ok

自動裝箱過程:把基本類型用它們對應的包裝類型進行包裝,使基本類型具有對象特征。 自動拆箱過程:與裝箱過程相反,把包裝類型轉換成基本類型。

通俗地講,裝箱和拆箱就是方便了程序員在包裝類和基本類之間的轉換,少寫了幾句話,簡潔了代碼,有的時候代碼里多出一句這樣類型的轉化確實有煞風景,自動裝箱和拆箱優勢是顯而易見的。

List<Integer> list = new ArrayList<>();list.add(1);list.add(Integer.valueOf(1));//實際操作 自動裝箱int n = list.get(0);int m = list.get(0).intValue();//實際操作 自動拆箱Integer p = 1;p++; //實際插入一句拆箱,再自增計算,再裝箱

在Integer等包裝類中,數值間的比較需要用equals方法,否則比較的是兩個對象的地址是否儲存于同一區域。用==來比較,根據被包裝到的對象情況,結果是true和false都有可能的。

Integer a = 1000;Integer b = 1000;System.out.PRintln(a==b); // 輸出:falseSystem.out.println(a.equals(b)); //輸出:true

值得一提的是,包裝類也是放置類型轉換這類靜態方法的好地方:

int x =Integer.parseInt("111"); // x=111

(三)foreach循環

java中提供了一個超級簡潔的循環方法,foreach循環。作為一種沒有索引的循環方式,foreach循環只能遍歷全部的元素而不具有選擇性,但是簡單的寫法還是方便了很多,在HashMap這種毫無索引的數據結構中,foreach循環相比for循環和while循環好的多。那么,foreach循環是用什么來實現的呢?答案就是迭代器Iterator。

for(int i : list){ System.out.println(i);}//實際迭代器實現for (Iterator localIterator = list.iterator(); localIterator.hasNext(); ) { int sub = ((Integer)localIterator.next()).intValue(); System.out.println(sub);}

遍歷所有的元素是用Iterator來實現的這點是容易想出來的,但是實際上的代碼量確實比foreach循環增加了不少,語法糖起到了方便代碼的作用,功不可沒。

(四)變長參數

在java1.5之后,提供了一種可變參數的方法調用,打破了參數只能是固定數量的尷尬局面。說起來玄,但是變長參數的方法我們在日常中幾乎天天用,比如字符串的格式化:

public void foo(String str,Object...args){...}//方法原型System.out.printf("%d",1);System.out.printf("%d,%s", 12,"a");//方法中的變長參數必須位于最后一個位置

變長參數的實質是把這個位于最后一位變長參數換做Object[],換來換去都是一樣的內容。

(五)條件編譯

條件編譯是Java虛擬機對代碼進行了簡化,它根據布爾常量的真假,去掉了分支不正確的代碼塊。只有使用條件為常量的If語句才能達到這種的效果。這一條也是容易理解的。

if(true) { System.out.println("true"); } else { System.out.println("false"); } //實際條件編譯System.out.println("true");

(六)內部類

虛擬機中沒有內部類,所有的內部類都通過一定的方法變成了普通類。

內部類詳解傳送門:http://blog.csdn.net/QuinnNorris/article/details/54864491

(七)枚舉類和switch

在java之中也存在著類似c++的枚舉類型,但是客觀上并沒有c++中的好用。枚舉類型可以包括有限個命名的值,并且可以聲明這種類型其中的變量:

package Syntactic;public enum Size { S,M,L,XL}Size s = Size.S; //聲明一個s,值為枚舉類型中的S

枚舉類也是一種語法糖,在虛擬機中并沒有枚舉類,JVM也不認識它。首先,所有的枚舉類都是繼承于java.lang.Enum類。在編譯時編譯器會把枚舉類直接變成實在的Enum的子類。枚舉類中的每一個值都會通過構造器變為實例。

//構造器protected Enum(String name, int ordinal) {...}//第一個參數為枚舉值,第二個參數為這個枚舉值默認的順序//下面是在編譯時,實際操作的將枚舉值實例化的過程new Enum<Size>("S",0);new Enum<Size>("M",1);new Enum<Size>("L",2);new Enum<Size>("XL",3);

與此同時,既然枚舉類型是語法糖,那么也就有switch用枚舉值作為判斷,也是一種語法糖。既然枚舉類型是語法糖,在虛擬機中并不存在這種語法,switch中的枚舉自然也是語法糖,那么它的原理是什么呢?

首先我們要分析一下switch能夠用什么來判斷。1.char、byte、int、short類型,2.枚舉類型,3.字符串字面量。在這些之中一定有一種類型是枚舉類型實際采用的判斷方式。實際上,枚舉類型采用的判斷方式是int(short)類型。我們剛才說過,在每個枚舉類型實例化的過程中都會貼上一個順序的序號的“標簽”。new Enum<Size>("S",0)在編譯的過程中,編譯器把這個序號作為他們的標記來替換switch中的枚舉類型。

(八)斷言語句

斷言語句是在java的測試階段普遍使用的一種語句,在1.4版本發布,而其本身也是一種語法糖。

異常、斷言與日志詳解傳送門:http://blog.csdn.net/quinnnorris/article/details/

(九)總結

在java中有很多糖衣語法,這些語法在不改變功能的情況下方便了我們的工作,提高了我們的效率。對于這些語法的內部實際處理雖然不一定用得到,但是有些了解還是很好的。語法糖是指那種在虛擬機中不存在但是我們可以這樣編寫代碼的語法,并不一定只有上述的幾種,但是上述是其中較為常用的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品在线视频| 国产成人精品视| 国产99久久精品一区二区 夜夜躁日日躁| 欧美国产日韩中文字幕在线| 精品国内亚洲在观看18黄| 欧美俄罗斯性视频| 欧美日韩国产va另类| 78色国产精品| 欧洲午夜精品久久久| 日日摸夜夜添一区| 国产91免费观看| 国产精品久久久av久久久| 亚洲免费一级电影| 黑人精品xxx一区一二区| 亚洲人成在线电影| 97人洗澡人人免费公开视频碰碰碰| 91av在线看| 久久久久久久999| 欧美在线视频免费播放| 91色p视频在线| 欧美日韩激情美女| 中文字幕免费精品一区高清| 中文字幕精品一区久久久久| 国产精品久久电影观看| 欧美精品久久一区二区| 国产精品欧美日韩久久| 免费不卡在线观看av| 欧美精品一区在线播放| 神马国产精品影院av| 日韩高清电影免费观看完整版| 中文综合在线观看| 亚洲人a成www在线影院| 色中色综合影院手机版在线观看| 欧美亚洲成人精品| 久久国产精品偷| 久久久久久国产精品三级玉女聊斋| 精品无人区乱码1区2区3区在线| www国产精品com| 精品国产乱码久久久久酒店| 奇米一区二区三区四区久久| 亚洲国产欧美一区二区丝袜黑人| 国产一区二区在线免费| 国内精品免费午夜毛片| 午夜精品蜜臀一区二区三区免费| 色综合色综合久久综合频道88| 久久久精品中文字幕| 亚洲女人天堂色在线7777| 久久精品国产亚洲精品| 中文字幕亚洲天堂| 日韩在线视频一区| 国产99久久精品一区二区 夜夜躁日日躁| 中日韩美女免费视频网址在线观看| 亚洲综合色激情五月| 深夜成人在线观看| 亚洲精品有码在线| 国产精品亚洲综合天堂夜夜| 亚洲国产精品人久久电影| 日韩精品在线免费观看视频| 欧美日韩黄色大片| 亚洲伊人久久综合| 成人网址在线观看| 欧美激情综合亚洲一二区| 欧美成人自拍视频| 丝袜亚洲另类欧美重口| 欧美专区日韩视频| 少妇高潮久久77777| 亚洲视屏在线播放| 久久精品国产成人| 日韩中文字幕不卡视频| 日韩视频在线一区| 91在线视频成人| 亚洲欧美国产精品专区久久| 全亚洲最色的网站在线观看| 一区二区三区黄色| 久久乐国产精品| 4438全国成人免费| 这里只有精品丝袜| 深夜精品寂寞黄网站在线观看| 欧美精品videosex极品1| 国产成人精品在线视频| 精品亚洲国产成av人片传媒| 91色视频在线观看| 国产做受高潮69| 亚洲一区二区三区成人在线视频精品| 国产精品入口日韩视频大尺度| 国产精品96久久久久久| 日韩**中文字幕毛片| 国产精品永久免费观看| 欧美中文在线免费| 亚洲第一精品夜夜躁人人爽| 国产成人精品国内自产拍免费看| 久久亚洲私人国产精品va| 在线观看欧美日韩国产| 欧美一级高清免费| 97人人爽人人喊人人模波多| 日韩免费观看网站| 国产精品高潮在线| 一本色道久久综合狠狠躁篇的优点| 国产精品久久久久av| 中文字幕一区电影| 亚洲毛片一区二区| 欧美国产第一页| 中文字幕亚洲字幕| www.99久久热国产日韩欧美.com| 亚洲午夜未满十八勿入免费观看全集| 最近2019年日本中文免费字幕| 久久男人资源视频| 另类天堂视频在线观看| 亚洲欧美在线一区| 黄色成人av网| 欧美精品一本久久男人的天堂| 97超级碰碰人国产在线观看| 国产精品成人品| 亚洲成人教育av| 日韩在线视频观看正片免费网站| 精品国产一区二区三区久久狼5月| 4438全国亚洲精品在线观看视频| 成人精品一区二区三区电影黑人| 欧美成人剧情片在线观看| 亚洲精品自拍视频| 亚洲第一综合天堂另类专| 日韩精品欧美激情| 91久久国产精品| 欧美日韩国产综合视频在线观看中文| 精品成人国产在线观看男人呻吟| 成人午夜激情免费视频| 色黄久久久久久| 欧美极品少妇xxxxⅹ免费视频| 日韩一区二区精品视频| 亚洲男人天堂手机在线| 欧美福利视频网站| 欧美在线激情视频| 亚洲日韩中文字幕| 国产成人97精品免费看片| 日韩欧美视频一区二区三区| 久久精品美女视频网站| 亚洲精品久久久久中文字幕欢迎你| 亚洲精品久久久一区二区三区| 国产美女久久精品香蕉69| 国产精品中文字幕在线观看| 欧美精品一区二区三区国产精品| 亚洲精品一区二区在线| 91大神福利视频在线| 亚洲精品久久久久中文字幕二区| 色婷婷av一区二区三区久久| 欧美成人免费视频| 日本久久久久久| 国产日韩欧美91| 国产精品18久久久久久麻辣| 亚洲精品国产suv| 久久久中文字幕| 亚洲精品二三区| 亚洲欧美国产制服动漫| 欧美在线激情网| 日韩视频精品在线| 亚洲天堂色网站| 一本一本久久a久久精品牛牛影视| 亚洲色图17p| 日韩在线视频导航| 亚洲男人天堂2024| 久久在线免费视频| 日韩精品中文字幕有码专区| 欧美亚洲成人免费| 97在线精品国自产拍中文|