麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

java糖衣語法(Syntactic Sugar)詳解

2019-11-14 11:22:12
字體:
供稿:網(wǎng)友

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

泛型與類型擦除 自動(dòng)裝箱和拆箱 foreach循環(huán) 變長參數(shù) 條件編譯 內(nèi)部類 枚舉類和switch 斷言語句

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

(一)泛型與類型擦除

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

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

(二)自動(dòng)裝箱和拆箱

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

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

自動(dòng)裝箱過程:把基本類型用它們對應(yīng)的包裝類型進(jìn)行包裝,使基本類型具有對象特征。 自動(dòng)拆箱過程:與裝箱過程相反,把包裝類型轉(zhuǎn)換成基本類型。

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

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

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

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

值得一提的是,包裝類也是放置類型轉(zhuǎn)換這類靜態(tài)方法的好地方:

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

(三)foreach循環(huán)

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

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

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

(四)變長參數(shù)

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

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

變長參數(shù)的實(shí)質(zhì)是把這個(gè)位于最后一位變長參數(shù)換做Object[],換來換去都是一樣的內(nèi)容。

(五)條件編譯

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

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

(六)內(nèi)部類

虛擬機(jī)中沒有內(nèi)部類,所有的內(nèi)部類都通過一定的方法變成了普通類。

內(nèi)部類詳解傳送門:http://blog.csdn.net/QuinnNorris/article/details/54864491

(七)枚舉類和switch

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

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

枚舉類也是一種語法糖,在虛擬機(jī)中并沒有枚舉類,JVM也不認(rèn)識它。首先,所有的枚舉類都是繼承于java.lang.Enum類。在編譯時(shí)編譯器會(huì)把枚舉類直接變成實(shí)在的Enum的子類。枚舉類中的每一個(gè)值都會(huì)通過構(gòu)造器變?yōu)閷?shí)例。

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

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

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

(八)斷言語句

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

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

(九)總結(jié)

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 91av亚洲 | 欧美日韩免费看 | 操你啦免费视频 | 羞羞的网站 | 国产91在线免费 | 中文字幕网在线 | 老女人碰碰在线碰碰视频 | 日韩视频一区在线 | 中文字幕国产亚洲 | 国产激情视频在线 | 色网站在线免费观看 | 制服丝袜日日夜夜 | 一本一本久久a久久精品综合小说 | 五月天影院,久久综合, | 欧美精品一区二区久久 | 久久蜜桃香蕉精品一区二区三区 | 国产精品午夜一区 | 午夜视频导航 | 97中文字幕在线观看 | 九九热精 | 日日摸夜夜骑 | 成人在线a| 九九热视频免费 | 中国洗澡偷拍在线播放 | www.com香蕉| 看全色黄大色黄大片女图片 | 欧美亚成人 | 久久美女色视频 | 日本一区二区久久久 | 久久精品毛片 | 国产最新网站 | 天堂二区 | 伦一区二区三区中文字幕v亚洲 | 国产色视频在线观看免费 | 亚洲成人网一区 | 欧美大胆xxxx肉体摄影 | 一级免费看片 | 少妇色诱麻豆色哟哟 | 黄色毛片a级 | 国产一级毛片高清 | 久草在线最新 |