(一)final和const類型html
若是你不打算修改一個變量的值,那麼就把它定義爲final或const類型。其中:final變量的值只能被設置一次,const變量是編譯時常量(const是隱式final)。final變量在第一次使用時初始化。(注:類實例變量能夠是final類型,但不能夠是const類型)python
final類型的用法例子以下,在final關鍵字後,可選擇是否顯式聲明變量類型:express
final name ='Bob'; final String nameS = 'Jack Ma';
經過上邊的基本用法咱們能夠看到:不一樣於C語言的const,dart的final既能夠做爲變量修飾詞,也能夠做爲變量類型使用。編程
當你試圖改變一個final類型的變量值時會發生什麼?咱們來試一下,對上例添加以下修改:數組
name = 'ma yun';
看,編譯器提示你出錯了!因此,final變量被初始化以後是不能修改其值的。post
關於const類型,官方給的說明是「編譯時常量」,我目前理解也不是太深入,直接舉個栗子吧:ui
var foo = const []; final bar = const []; const baz = [];
以上用法都是合法的,你還能夠作以下操做,也是合法的,由於foo是var類型:編碼
foo = [1,2,3];
但你不能夠作下邊的操做,,由於baz是const類型的:spa
baz = [2,5,9];
下邊看一種const使用的特殊狀況,你們本身體會體會吧:code
//如下3行代碼合法 const a = 2; const b = 3; const c = a * b; //如下代碼編譯出錯,由於a是int而不是const類型的 int a = 2; const b = 3; const c = a * b; //如下兩行代碼合法,由於2看成const常量類型 const b = 3; const c = 2 * b;
(二)Built-in類型
Dart語言支持如下8種內建數據類型。
(1)Numbers類型
Dart的數字類型有兩種:int和double。int變量一般不超過64bit,這取決於運行平臺。double是64bit雙精度浮點型。
int和double都是num的子類型,num類型包括一些基本的操做,如+-*/,(位操做符,如>>,是在int類裏定義的),若是num或num子類型不能知足你的需求,試試dart:math庫。
關於什麼是整型數、什麼是浮點數就再也不舉例子了啊,另外浮點數支持科學表示法。int類型可根據須要自動轉換爲double類型,如: double a = 1;
下邊舉例看看字符串和數字之間的轉換,這個我以爲一般挺有用的:
int i = int.parse('126'); //把字符串‘126’轉化爲整數126 double db = double.parse("12.36"); //把字符串'12.36‘轉化爲12.36 String str = i.toString(); //把整型數字126(變量i)轉化爲字符串’126‘ //下邊一行語句把12.36轉化爲字符串,小數點後保留1位,自動四捨五入 String pStr = db.toStringAsFixed(1);
int類型的變量能夠進行位運算操做,以下,再也不細述:
int a = 3<<1; int b = 2|3; int c = 8>>1;
(2)String類型
Dart的字符串是utf-16的序列。dart和python相似,可使用雙引號,也可使用單引號建立字符串。
下面看一個例子(完整,可編譯),這個栗子裏邊包含了兩個很小、卻很關鍵的知識點:
main() { String s1 = 'Jack Ma'; String s2 = '$s1 is ma yun'; int i1 = 123456; String s3 = 'I have ${i1.toString()} yuan'; print(s2); print(s3); if('Jack Ma is ma yun' == s2) { print('***'); } }
上述代碼的運行結果是:
知識點:
一、你可使用 ${expression} 將表達式的值嵌入到一個字符串中(如上例中s3變量),若是表達式只是一個標識符,則能夠直接省略{}, 如上例中的s2變量;
二、可使用 == 操做符比較兩個字符串是否相同。
下面再看一個例子:
main() { String s1 = 'Jack Ma'; String s2 = ' is '; String s3 = 'Ma yun'; String s4 = s1 +s2 +s3; String s5 = 'Jack Ma'' is ''Ma yun'; print(s5); }
上例運行的結果是
Amazing!!!咱們看看s5是個什麼變量,字符串,咱們再看看它是怎麼賦值的?個人天吶, 把 'Jack ma'、' is '和'Ma yun'三個字符串緊挨着放在一塊兒,dart就能把他們合併成一個字符串變量。你們能夠打印下s4觀察輸出。
知識點:
一、可使用 + 操做符,將多個字符串進行拼接;
二、能夠把相鄰的字符串放在一塊兒,編譯器自動爲你拼接;
三、可使用三個引號(雙引號或單引號都可)建立跨行字符串(和Python相似);
四、能夠經過前綴r來建立原始字符串(和Python相似,原始字符串不對轉義字符進行特殊處理,如 r'hh\n' 不會將\n處理爲換行)。
(3)Booleans類型
Dart使用類型bool來表示boolean值,只有兩個對象是bool類型:true和false,這兩個都是編譯時常量。
bool類型比較簡單,官網惟一的提示就是 不能使用 if(非布爾值) 或 assert(非布爾值) 這樣的表達式。
(4)Lists類型
在Dart中,數組是列表對象。看下例子:
var list_a = [2,3,6];
//list_a[0] = 'string'; Error
以上程序,dart推斷list_a是 List<int> ,當你試圖添加一個非整型數據進去時,編譯器會報錯。
dart的數組像C語言同樣,下標從0開始,到length-1爲止,其中,能夠經過list.length獲取得數組的長度,以下:
main() { var list_a = const [2,3,6]; // 定義一個編譯時常量list print(list_a[0]); // 打印:2 print(list_a[2]); // 打印:6 print(list_a.length); // 打印:3 }
(5)Sets類型
Dart中的set是一系列無序項的集合。看一個簡單的例子:
var set_exam = {'set111', 'set222', 'set333'};
上例中,dart可以推斷出set_exam是String類型的set,當你試圖追加非string類型的值時,會報錯。
當你想建立一個空的set時,須要在{}符號前添加set裏變量的類型,或者使用set類型建立,如:
//建立一個set,其中可存放string類型的值 var names = <String>{}; 或者 Set<String> names = {}; //與上面的等價 //var names = {}; 這句話就不行了,這是建立了一個map,而不是set
向一個set中添加數據可以使用add()或addAll()方法,以下例:
var set_1 = {'111', '222', '333'}; var set_2 = <String>{}; set_2.add('Add method'); set_2.addAll(set_1);
使用 length 屬性去獲取一個set裏的元素個數,如:
var set_1 = {'111', '222', '333'}; var set_2 = <String>{}; set_2.add('Add method'); set_2.addAll(set_1); var set_num = set_2.length; print(set_num); //打印出的值爲 4
建立一個const的set,可直接在{}前添加const修飾.
(6)Maps類型
Dart的map是一種key-value鍵對的類型,key和value都可以是任意值。一個key只能對應一個value,可是一個value卻能夠有多個key。看一個map的簡單例子吧:
var map_1 = {'first':'111', 'second':'222', 'third':'333'}; var map_2 = {1:'111', 2:'111', 3:'333'};
上例中,dart推斷map_1是 Map<String,String> 類型,而map_2是 Map<int, String> 類型。同set同樣,在類型肯定後,你不能再添加非此類型的鍵值對了。
也可使用Map構造一個map變量:
var gifts = Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings';
向一個map變量中添加鍵值對:
var gifts = {'first': 'partridge'}; gifts['fourth'] = 'calling birds'; // Add a key-value
能夠直接 String st=gifts['first']; 來獲取某個鍵對應的值,當這個鍵在map中不存在時,將返回null.
像set同樣,map也可使用 .length 來獲取其中的鍵值對數,再也不細述。
(7)Runes類型
Dart的rune類型主要是unicode編碼之類的,我還沒看太明白。。。
(8)Symbols類型
Dart的Symbol表示程序中出現的操做符或標識符,實際編程中沒啥接觸,再也不細述。