dart基礎之變量數據類型操做符方法異常

筆者也是剛剛接觸dart的學習,畢竟做爲一門出現比Java更晚的語言,感受相比java仍是有不少人性化的地方。如今就以和你們熟悉的java對比的角度,分享一下dart中和java不一樣的地方。
java

1、變量數組

咱們知道在Java中聲明變量的時候必定要給予類型,可是在dart中能夠不指定類型,進而使用Object、var、dynamic來代替,下面筆者帶你們一一過一下。安全

Object:其中Object表明全部對象,這個和java沒什麼區別,故而Object能夠用來聲明全部類型的變量,固然也包括int。這裏須要注意的是,在dart中int也是一個類,而不是關鍵字了,能夠在AS中點進去查看int類信息。進而咱們get到dart並非徹底按照駝峯規則來編寫的,好比int是一個類,在駝峯規則中首字母本應該大寫,可是卻沒有。閉包

var:其實在不少語言中都有var的用法,好比js、kotlin等。在dart中,var聲明的變量在聲明時已經決定了類型,後面不能更改,若是更改ide將會直接報錯。可是若是在聲明時沒有賦值,而是後面賦值的話,該變量類型是能夠修改的。ide


dynamic:在運行時動態修改變量類型,能夠隨意賦值任何類型。可是根據筆者經驗,通常運行時修改的效率都會更低一些,好比反射。因此不優先使用dynamic,後面碰到有坑再說。函數

final和const修飾符:使用final和const修飾符均可以將變量修飾成不可變,區別在於final是運行時賦值,可是const是在編譯時就已經賦值,因此若是將一個final變量賦值給const變量是會報錯的,由於const須要在編譯時給定值,可是此時final的變量並無真正賦值。反之const賦值給final則能夠,const賦值給cost、final賦值給final都可以。學習

2、數據類型大數據

在java中,擁有八大數據類型,相信你們都知道,這裏就不一一舉例了,在dart中那八大數據類型也是支持的,只是說從java中數據類型是關鍵字變成了類而已,而且取消了包裝類機制,和java使用起來如出一轍。值得一提的是,在dart中新增了一些數據類型,接下來一一說明。優化

num:前面說過,在dart中數據類型也是類,好比int雖然首字母小寫可是它依然是一個類。num也是同樣,num有2個子類,分別是int和double。須要注意的是在dart中沒有float這個數據類型,只有double。總結來講就是,若是一個數字既多是整型又多是浮點型的話,能夠定義爲num的對象。若是想讓double轉int可使用doubleValue.toInt()方法,注意若是在計算時double/double表示返回一個double,可是使用double~/double來表示返回整數。ui

String:在dart中String能夠用單引號、雙引號、三引號包起來,單雙引號做用相似,可是能夠配合起來使用,解決在雙引號中包含特殊字符的問題,好比若是一個變量是a"b",若是在java中表示該字符串,須要寫成"a\"b\"",可是利用單雙引號配合,則能夠簡寫成'a"b"'或者"a'b'"便可。三引號表明能夠換行的字符串,能夠直接在內容中間回車。

List:和java中的數組相似,也能夠初始化的時候直接賦值,好比List<int> lists = [1,2,3,3],下標也是從0開始,好比修改第一個元素的值爲2能夠寫成lists[0]=2。能夠用const關鍵字來修飾,表明該list不可變。const List = XX和List = const XX這兩種寫法均可以。遍歷的話和java相似,也能夠用for循環和foreach循環。for(int i in lists)、lists.foreach((e)=>{print(e)})。

map:在dart中map鍵值對支持在初始化的時候賦值,相似於這樣,map m ={ 'a': '阿里巴巴', 't': '騰訊', 'b': '百度'},獲取值也是根據key來獲取value,相似於var valuea = m['a']。遍歷的話仍然是迭代器,和java中同樣。

3、操做符

java中常見操做符在dart中依然可用,這裏說一說dart新增的操做符

1.類型斷定操做符

as:相似於java中的強制轉換,將A類型的數據強制轉換成B類型,若沒法轉換則拋出異常

is:判斷某個對象是否屬於某個類,至關於java中的instanceof關鍵字

is!:和is相反,若是某個對象屬於某個類,則返回false

2.賦值操做符

??=:跟在一個變量後面,若是該變量值不爲null則保持不變,若是爲null則賦值成另外的值。舉個例子,b ??= value,若是b爲null則無論,不爲null則將b賦值成value

3.條件表達式

expr1 ?? expr2:若是expr1不爲null,則返回其值,不然返回expr2的值

4.級聯操做符

..:級聯操做符能夠在同一個對象上 連續調用多個函數以及訪問成員變量。 使用級聯操做符能夠避免建立臨時變量, 而且寫出來的代碼看起來更加流暢,至關於dart系統自帶build模式

5.安全操做符

?.:若是該操做符前面的變量爲null則返回null不調用後面的方法或屬性,能夠避免空指針。好比print(a?.length),若是不用安全操做符還須要判斷a是否爲null,不然萬一爲null會報空指針

4、方法

dart中方法也有不少有趣的地方,不少都是借鑑的其餘語言優勢。這裏就以java做爲對比,列舉一下dart中新特性。

特性一  方式實現可簡寫

當方法中只有一個表達式時,能夠不使用大括號包住實現,而是使用等號箭頭。注意,這裏的參數類型已經省略,返回值void其實也可省略,只是不推薦這麼作,省略號將變成dynamic。


特性二  一等方法對象

在dart中方法也是對象,方法的父類爲Function類,這意味着方法能夠賦值爲變量,也意味着方法也能夠做爲參數傳遞其餘方法中。


特性二  可選位置參數

把方法的參數放到[ ]中,表明參數可傳可不傳,傳值時按照參數位置順序傳遞 。以下定義了一個func方法,將i和j做爲可選位置參數,最後調用時只傳了1個。根據可選位置參數的特性,當參數只傳了一個時,固定傳給第一個參數,最後打出的結果是i爲1,j爲null。注意,當傳的參數類型和方法第一個參數不一致時,好比講參數1換成字符串,將直接報錯。

特性三  可選命名參數

把方法的參數放到{ }中,表明參數必須經過指定形參名進行傳參。以下圖,經過形參:值進行傳值,也能夠只傳其中一部分,可是必須執行給誰傳值了。


特性四  默認參數值

使用[ ]或者{ }方式定義方法中的參數時,能夠給定默認值。以下,在定義方法func時,咱們給定了i和j分別一個默認值,在它們沒傳值時默認爲0。


特性五  匿名方法

dart也支持匿名方法,也能夠稱之爲 lambda 或者 closure 閉包 ,能夠做爲傳參用。以下例,在調用方法時將一個匿名方法傳入另外一方法test中,接下來在test方法調用參數f自身。

5、異常

和 Java 不一樣的是,全部的 Dart 異常是非檢查異常。 方法不必定聲明瞭他們所拋出的異常, 而且不要求你捕獲任何異常。 另外,Dart 提供了 ExceptionError 類型, 以及一些子類型。你還能夠定義本身的異常類型。可是, Dart 代碼能夠拋出任何非 null 對象爲異常,不只僅是實現了 Exception 或者Error 的對象。 以下圖,咱們拋出了一個整數異常,將在try...catch中的on int catch(e){}中被捕獲。這是和java不同的地方,java只能拋出Exception子類。


在java中,經過catch到的Exception類型來區分Exception做相應處理。在dart中經過on 任意對象類的方式來抓住錯誤,該對象即爲throw的對象,這裏可使用rethrow將捕獲的異常從新拋出。同時catch中參數e是拋出的異常對象,能夠經過e.runtimeType來查看實際的類,s是錯誤堆棧。dart中try...catch也是有finally的,finally和Java同樣在try catch執行完後執行。


總結:本次以java做爲對比,介紹了一下dart中的亮點新玩法,裏面確定有沒有列全的,請你們多擔待,由於筆者也是剛接觸dart,後面有新的發現會繼續學習而後給你們分享。固然有不少方面沒有跟你們說到,沒說到的部分就默認和java同樣,你們能夠本身嘗試去親身體驗一把。總而言之,咱們能夠發現,dart確實是一門很簡潔的語言,有不少地方均可以省略,好比變量類型、方法類型、單表達式的方法體括號等等。同時,又有不少的優化,只要在判空和賦值方面,具體見上面的操做符部分。而後,還有不少的新鮮玩法,好比支持匿名方法、能夠將任何類做爲異常捕獲對象、在java中熟知的int等基本數據類型也變成了類。我相信確定還有更多的好玩點等着咱們去學習發現,筆者後面學習到了再繼續分享出來。

相關文章
相關標籤/搜索