[Flutter]flutter基礎(chǔ)之Dart語(yǔ)言基礎(chǔ)(一)

一拾并、概述

Dart 是 Google 公司在2011年10月發(fā)布的一種編程語(yǔ)言揍堰,主要是將其作為一種結(jié)構(gòu)化的 Web 開(kāi)發(fā)語(yǔ)言⌒嵋澹可以用在Web屏歹、服務(wù)器、移動(dòng)應(yīng)用和物聯(lián)網(wǎng)等領(lǐng)域的開(kāi)發(fā)之碗,是寬松開(kāi)源許可證(修改的BSD證書(shū))下的開(kāi)源軟件蝙眶。官方網(wǎng)站:https://dart.dev/

在 Dart 中继控,所有東西都是對(duì)象械馆,變量胖眷,數(shù)字武通,函數(shù)等都是對(duì)象類型,都是類的實(shí)例珊搀,所有對(duì)象都繼承自 Object 類冶忱。

在進(jìn)行 Dart 開(kāi)發(fā)前,需要安裝 Dart SDK境析,安裝方法官網(wǎng)網(wǎng)站有介紹囚枪,地址為:https://dart.dev/get-dart 派诬。如直接進(jìn)行 Flutter 開(kāi)發(fā),也可不用下載此 SDK 链沼,直接安裝 Flutter 即可默赂。Flutter開(kāi)發(fā)工具包中包含 Dart。

二括勺、語(yǔ)法基礎(chǔ)

1. 入口方法

Dart 語(yǔ)言文件格式為 .dart 缆八,并以 main 方法作為程序的入口點(diǎn),我們使用 VSCode 創(chuàng)建 demo1.dart 文件疾捍,代碼如下:

main(){
  print('hello dart!');  //輸出結(jié)果:hello dart!
}

Dart 語(yǔ)言有很多簡(jiǎn)寫(xiě)形式奈辰,以上的 main 方法就是簡(jiǎn)寫(xiě),完整的寫(xiě)法如下:

void main(List<String> args){
  print('hello dart!');
}

參數(shù)為泛型的寫(xiě)法乱豆,List 為列表奖恰,也就是其他語(yǔ)言中的數(shù)組。 main 方法可以接收由命令行輸入的參數(shù)宛裕,可以通過(guò) args 參數(shù)在程序中獲取瑟啃。如下代碼:

void main(List<String> args){
  print('hello dart!');
  print(args);
}

通過(guò)命令行的方式運(yùn)行 dart 文件,首先 cd 到目標(biāo)文件夾续滋,運(yùn)行如下命令: dart demo1.dart arg1,arg2 翰守,輸出結(jié)果如下:

hello dart!
[arg1,arg2]

一般情況下,使用省略方式即可疲酌。

在 Dart 中蜡峰,print 方法不支持多參數(shù)打印,其函數(shù)原型如下:

void print(Object object);

只支持單參數(shù)打印朗恳,但是可以利用字符串插值的方式進(jìn)行多參數(shù)打印湿颅,使用 $ 美元符號(hào),比如打印 a, b兩個(gè)變量粥诫,如下:

print("$a $b");

以上是利用字符串插值進(jìn)行多參數(shù)打印油航,但實(shí)質(zhì)上依然是單參數(shù),只不過(guò)利用了字符串的插值特性輸出多個(gè)參數(shù)而已怀浆。當(dāng)然依然可以利用多個(gè) print 打印多個(gè)參數(shù)谊囚。

2. 數(shù)據(jù)類型

Dart 中所有類型都是對(duì)象,基礎(chǔ)數(shù)據(jù)類型也是對(duì)象执赡,都有自己的方法和屬性镰踏。Dart 支持自動(dòng)類型推斷,所以在定義數(shù)據(jù)類型的時(shí)候沙合,可以通過(guò)兩種方式進(jìn)行定義奠伪,直接使用具體數(shù)據(jù)類型定義和使用 var 關(guān)鍵字進(jìn)行定義。當(dāng)使用 var 定義時(shí),編譯器會(huì)根據(jù)具體的賦值數(shù)據(jù)類型推斷出定義的變量或常量的數(shù)據(jù)類型绊率。

可以使用 runtimeType 來(lái)查看對(duì)象的運(yùn)行時(shí)類型谨敛。

因?yàn)?Dart 中所有的類型都是對(duì)象,所以定義一個(gè)數(shù)據(jù)類型以后滤否,如果未對(duì)其進(jìn)行初始化操作脸狸,則其默認(rèn)值為null

Dart 中藐俺,變量是區(qū)分大小寫(xiě)的肥惭。

**2.1.1 數(shù)值類型 (Numbers) **

Dart 中數(shù)值類型有兩種,整數(shù)( int )和小數(shù)( double)紊搪,他們繼承自 num 類蜜葱。使用直接數(shù)據(jù)類型定義方式如下:

main(){
  int a = 10;
  double b = 20.1;
  print(a);  //輸出10
  print(b);  //輸出20.1
  print(a+b);////輸出30.1
}

也可以使用如下方式定義:

main(){
  var a = 10;
  var b = 20.1;
  print(a);
  print(b);
  print(a+b);
  print(a.runtimeType);  //輸出int
}

輸出結(jié)果與上面相同,下面的方式編譯器會(huì)自動(dòng)推斷出具體的數(shù)據(jù)類型耀石。

Dart 中可以使用十進(jìn)制和十六進(jìn)制進(jìn)行整數(shù)的賦值牵囤,不能使用其他進(jìn)制。

2.1.2 字符串類型 (Strings)

使用關(guān)鍵字 String 來(lái)聲明字符串類型滞伟,字符串使用單引號(hào)或雙引號(hào)包起來(lái)揭鳞,Dart 中字符串是UTF-16編碼,如下:

main(){
  String str1 = 'hello dart!';
  var str2 = "hello world!";
  print('$str1 $str2');  //輸出 hello dart! hello world!
}

也可以在定義一個(gè)變量的同時(shí)直接賦值多個(gè)字符串梆奈,如下:

main(){  
  String str = 'hello dart! ' 'this is'
   " a string";
  print(str);  //輸出 hello dart! this is a string
}

可以看到上面的代碼野崇,我們定義了一個(gè)變量,但是賦值了三個(gè)字符串亩钟,編譯器會(huì)將三個(gè)字符串合并為一個(gè)字符串進(jìn)行處理乓梨。但是雖然我們分兩行書(shū)寫(xiě)的字符串,但是在輸出時(shí)并沒(méi)有分行清酥,也就是定義與輸出的格式并不一樣扶镀,如果需要定義與輸出一樣,可以使用如下方式:

main(){  
  //1.通過(guò)轉(zhuǎn)義字符\n進(jìn)行換行操作
  String str = "hello dart! \nthis is a string ";
  print(str);

  //2.通過(guò)```或"""將字符串包裹起來(lái)為多行字符串焰轻,使用此方式時(shí)臭觉,需注意字符串的對(duì)齊方式,字符的前面的空格會(huì)包含在內(nèi)辱志,左邊界為編譯器的行頭
  var str1 = '''hello dart! 
  this is a string''';
  print(str1);
}

輸出結(jié)果如下:

hello dart! 
this is a string 
hello dart! 
  this is a string

可以使用加號(hào)和插值的方式進(jìn)行拼接蝠筑,如下:

main(){  
  String a = "hello";
  String b = " dart!";
  print(a + b);  //輸出 hello dart!
  print("$a$b"); //輸出 hello dart!
}

使用字符串插值的方式進(jìn)行拼接時(shí),如果 $ 后為一個(gè)標(biāo)識(shí)符則可直接使用揩懒,如果為表達(dá)式則需要使用 {} 將表達(dá)式包含起來(lái)什乙,如下:

main(){  
  String a = "hello";
  String b = " dart!";
  print(a + b);
  print("${a.runtimeType} ${b.runtimeType}"); //此處需要使用{}將表達(dá)式包含起來(lái)作為一個(gè)標(biāo)識(shí)符使用
}

在 Dart 中,字符串也是一種集合類型旭从,可以通過(guò)如下方式獲取字符串中的單個(gè)字符:

main(){  
  String str = "hello dart!";
  print(str[0]);  //輸出 h
  print(str[4]);  //輸出 o
}

下標(biāo)從0開(kāi)始稳强。

也可以通過(guò) * 運(yùn)算符對(duì)字符串進(jìn)行拷貝操作,如下:

main(){  
  String str = "hello dart!";
  print(str*2);  //輸出 hello dart!hello dart!
}

使用如下方式原樣輸出字符串和悦,包括里面的轉(zhuǎn)義字符:

main(){  
  var str = r"this is a \n string!";
  print(str);  //輸出 this is a \n string!
}

2.1.3 布爾類型 (Booleans)

Dart 中退疫,布爾類型只有兩個(gè)字面量值:truefalse

main(){  
  bool a = true;
  var b = false;
  print("$a $b");  //輸出 true false
  print(b.runtimeType);  //輸出 bool
}

上面說(shuō)過(guò)鸽素,Dart中所有的類型都是對(duì)象褒繁,如果在定義 bool 類型時(shí),沒(méi)有進(jìn)行初始化馍忽,則其默認(rèn)值為 null棒坏,在進(jìn)行條件判斷時(shí)會(huì)報(bào)異常,如下:

main(){  
 bool c;
 if(c) {   
   print(c);
 }
}

上面的代碼編譯不會(huì)報(bào)錯(cuò)遭笋,運(yùn)行時(shí)會(huì)報(bào)如下異常:

Unhandled exception:
Failed assertion: boolean expression must not be null

所以在使用 bool 類型進(jìn)行條件判斷時(shí)坝冕,如果有為空的可能應(yīng)先進(jìn)行是否為 null 的判斷,并且 Dart 中的條件判斷必須使用 bool 類型瓦呼,其他類型會(huì)編譯錯(cuò)誤喂窟。

2.1.4 集合類型

列表 (Lists)

列表用來(lái)存放一組數(shù)據(jù),在很多其他編程語(yǔ)言中央串,列表也被稱為數(shù)組磨澡,所以與其他語(yǔ)言一樣,下標(biāo)從0開(kāi)始质和,最后一個(gè)數(shù)據(jù)元素的下標(biāo)為 lenght-1 稳摄。列表的具體數(shù)據(jù)類型由其中的元素類型決定,使用方式如下:

main(){  
  var arr  = [1, 2, 3];
  var arr1 = [1, 2, 3, "string"];
  List arr2 = [1, 2, 3];
  List arr3 = [1, 2, 3, "string"];

  print("$arr \t\t\t ${arr.runtimeType}");
  print("$arr1 \t ${arr1.runtimeType}");
  print("$arr2 \t\t\t ${arr2.runtimeType}");
  print("$arr3 \t ${arr3.runtimeType}");
}

輸出結(jié)果如下:

[1, 2, 3]                    List<int>
[1, 2, 3, string]    List<Object>
[1, 2, 3]                    List<dynamic>
[1, 2, 3, string]    List<dynamic>

以上方式直接創(chuàng)建 List 并進(jìn)行初始化操作饲宿,定義空列表厦酬,使用 var arr = []; 即可。需要注意如果不進(jìn)行初始化瘫想,其數(shù)據(jù)類型為 null 弃锐,即便使用 List arr; 定義,其 runtimeType 類型也為 Null 殿托。

也可使用構(gòu)造方法創(chuàng)建數(shù)組霹菊,如下:

main(){  
  var arr = new List();   //創(chuàng)建空列表
  var arr1 = new List(3); //創(chuàng)建長(zhǎng)度為3的列表,使用null填充
  var arr2 = new List.filled(3, 1); //創(chuàng)建長(zhǎng)度為3的列表支竹,并使用整形數(shù)據(jù)1填充
  var arr3 = new List.filled(3, "a"); //創(chuàng)建長(zhǎng)度為3的列表旋廷,并使用字符串a(chǎn)填充

  print("$arr \t ${arr.runtimeType}");
  print("$arr1 \t ${arr1.runtimeType}");
  print("$arr2 \t ${arr2.runtimeType}");
  print("$arr3 \t ${arr3.runtimeType}");
}

輸出如下:

[]                                      List<dynamic>
[null, null, null]    List<dynamic>
[1, 1, 1]                     List<int>
[a, a, a]                     List<String>

在 Dart 中,可是省略 new 關(guān)鍵字礼搁,如下:

main(){  
  var arr = List(2);
  arr[0] = 10;
  arr[1] = "str";
  print("$arr \t ${arr.runtimeType}");   //輸出 [10, str]      List<dynamic>
  print(arr.length);  //輸出 2
}

以上創(chuàng)建的列表都是可存放任意類型的數(shù)據(jù)的饶碘,如果想存放固定類型的數(shù)據(jù),可以使用泛型進(jìn)行數(shù)據(jù)類型約束馒吴,使用方式如下:

main(){  
  List<String> arr = ["str1", "str2"];
  print(arr);  //輸出 [str1, str2]

  var arr1 = List<int>();
  arr1.add(1);
  arr1.add(2);
  print(arr1);  //輸出 [1, 2]
}

創(chuàng)建固定數(shù)據(jù)類型的列表扎运,如果添加其他數(shù)據(jù)類型數(shù)據(jù)編譯器會(huì)報(bào)錯(cuò)瑟曲。

集合 (Sets)

SetList 類似,但是 Set 為無(wú)序列表豪治,所以不能通過(guò)下標(biāo)的方式進(jìn)行訪問(wèn)洞拨。 Set 中不能有重復(fù)數(shù)據(jù),如果存在重復(fù)數(shù)據(jù)负拟,只會(huì)保留一份數(shù)據(jù)烦衣。依靠此特性,一般使用 Set 來(lái)對(duì)列表進(jìn)行去重處理掩浙。

main(){  
  Set set = {1, 2, 3, 4, 2};
  print(set);   //輸出 {1, 2, 3, 4}

  var set1 = {"str1", "str2", "str1", 1, 2, 3, 2};
  print(set1);  //輸出 {str1, str2, 1, 2, 3}

  var set2 = Set();
  set2.add(1);
  set2.add(2);
  set2.add(2);
  set2.add("str");
  print(set2);  //輸出 {1, 2, str}

  Set<int> set3 = Set();
  set3.add(1);
  // set3.add("str");  //錯(cuò)誤
  print(set3);  //輸出 {1}

  Set set4 = Set<String>();
  print(set4);  //輸出 {}
}

數(shù)組去重處理花吟,如下:

main(){  
  var arr = [1, 2, 3, 4, 5, 6, 3, 4];
  Set set = Set.from(arr);
  var arr1 = List.from(set);
  print(arr1);  //輸出 [1, 2, 3, 4, 5, 6]
}

字典 (Maps)

字典是一組鍵值對(duì)的集合,可以通過(guò)鍵完成對(duì)值的修改厨姚、查找衅澈、添加或刪除操作,其中谬墙,鍵( key ) 必須是唯一的矾麻。創(chuàng)建 Map 類型,鍵 (key) 與值 (value) 要成對(duì)出現(xiàn)芭梯。一般情況下险耀,鍵都是字符串類型,但是 Dart 中并沒(méi)有嚴(yán)格約束鍵的數(shù)據(jù)類型玖喘,所以鍵可以為任意類型甩牺,值也可以為任意類型。如果需要?jiǎng)?chuàng)建固定類型的鍵值累奈,可通過(guò)泛型進(jìn)行約束贬派。

main(){  
  var map1 = {
    "name" : "zhangsan",
    "age" : 20
  };

  var map2 = {
    1 : 20,
    2 : 30.2
  };

  Map map3 = {
    "name" : "lisi",
    1 : [1, 2, 3]
  };

  Map map4 = new Map();

  Map map5 = Map.from(map1);

  Map<String, int> map6 = {
    "number" : 1,
    "age" : 20
  };
  
  Map map7 = Map<String, dynamic>();
  map7["name"] = "wanger";
  map7["age"] = 20;

  print(map1);  //輸出 {name: zhangsan, age: 20}
  print(map2);  //輸出 {1: 20, 2: 30.2}
  print(map3);  //輸出 {name: lisi, 1: [1, 2, 3]}
  print(map4);  //輸出 {}
  print(map5);  //輸出 {name: zhangsan, age: 20}
  print(map6);  //輸出 {number: 1, age: 20}
  print(map7);  //輸出 {name: wanger, age: 20}
}

2.1.5 泛型

泛型,即通用類型澎媒,使 Dart 中的類型更加動(dòng)態(tài)搞乏,提高了代碼的重用率。Dart 中使用 <T> 的方式來(lái)定義泛型戒努,T 為標(biāo)識(shí)符或關(guān)鍵字请敦,一般用 T 表示。上面的例子中也使用了泛型來(lái)約束數(shù)據(jù)類型储玫,例如列表:

main(){  
  var arr = List<String>();
  arr.addAll(["str1", "str2", "str3"]);
  print(arr);  //輸出 [str1, str2, str3]
}

2.1.6 符文 (Runes)

符文(runes)是字符串的UTF-32編碼點(diǎn)侍筛,要在字符串中表示32位的Unicode值,可使用 \uxxxx 形式撒穷,xxxx 為四位十六進(jìn)制值匣椰,如多于或少于四位,則需要使用 {} 包裝端礼。

main(){  
  var value = '\u{1F362}';
  print(value);  //輸出 
}

2.1.7 符號(hào)類型 (Symbols)

Symbol 表示運(yùn)算符或標(biāo)識(shí)符禽笑,使用相同名稱創(chuàng)建的符號(hào)是相等的入录,有如下兩種方式創(chuàng)建符號(hào):

main(){  
  var symb = Symbol("s");  //通過(guò)構(gòu)造方法創(chuàng)建符號(hào)
  var symb1 = #s;                //通過(guò)#創(chuàng)建符號(hào)
  print(symb.runtimeType);  //輸出 Symbol
  print(symb1.runtimeType); //輸出 Symbol

  if(symb == symb1) {
    print("相同");
  }
}

2.1.8 常量

以上聲明的變量都是可變量,也就是變量佳镜,有時(shí)候需要一些數(shù)據(jù)是不可變的僚稿,稱為常量。在 Dart 中邀杏,定義常量可以通過(guò)關(guān)鍵字 constfinal 來(lái)定義,如下:

main(){
  const a = 10;  //聲明具體數(shù)據(jù)類型和var關(guān)鍵字
  final String b = 'hello dart!';
  print("$a $b");  //輸出 hello world! hello dart!
  print("${a.runtimeType} ${b.runtimeType}");!  //輸出 String String
}

可以看出唬血,在聲明常量時(shí)望蜡,可以省略其數(shù)據(jù)類型,編譯器會(huì)自動(dòng)進(jìn)行推斷拷恨。無(wú)論使用 const 還是 final 聲明的常量都是不可以改變的脖律,并且在定義常量時(shí),在定義的同時(shí)就需要對(duì)其進(jìn)行初始化操作腕侄,否則會(huì)報(bào)錯(cuò)小泉。如果試圖對(duì)常量進(jìn)行重新復(fù)制,也會(huì)報(bào)錯(cuò)冕杠。

上面的代碼中微姊,使用 constfinal 聲明的常量,其輸出的最終數(shù)據(jù)類型都為 String 分预,那么具體他們之間的區(qū)別是什么呢兢交?

const 定義的常量在定義時(shí)必須賦值為一個(gè)常量值,不可以通過(guò)表達(dá)式或函數(shù)進(jìn)行賦值操作(常量表達(dá)式可以)笼痹,而 final 定義的常量則可以通過(guò)表達(dá)式或函數(shù)賦值配喳,也就是說(shuō) const 常量為編譯時(shí)常量,在編譯階段就必須是可知的凳干,而 final 常量是只能對(duì)其進(jìn)行一次賦值晴裹,但是可以在運(yùn)行時(shí)進(jìn)行設(shè)置。 如下:

main(){  
  const a = 10;
  final b = 20.5;
  const c = a ;
  final d = a;
  // const e = a+b;  //錯(cuò)誤
  final f = a + b;
    const g = a * 10;  //正確救赐,因?yàn)閍為常量涧团,常量表達(dá)式在編譯期就可以確定值
  
  print(a);  //輸出 10
  print(b);  //輸出 20.5
  print(c);  //輸出 10
  print(d);  //輸出 10
  print(f);  //輸出30.5
  print(g);  //輸出 100
}

const 還可以用來(lái)創(chuàng)建常量值以及聲明創(chuàng)建常量值的構(gòu)造函數(shù)(后期文章會(huì)介紹到),創(chuàng)建常量值如下:

main(){  
  List a = const [1, 2, 3];
  List b = const [1, 2, 3];

  if(a == b) {
    print("相同");   //會(huì)輸出 相同
  }
}

如果不用 const 修飾经磅,則a與b為不同少欺,如下:

main(){  
  List a = [1, 2, 3];
  List b = [1, 2, 3];

  if(a == b) {
    print("相同");
  }else print("不同");  //輸出 不同
}

并且 使用如下方式聲明創(chuàng)建的常量值是可以改變的:

main(){  
  List a = const [1, 2, 3]; //可改變
  const b = [1, 2, 3]; //不可改變

  a = [4, 5, 6];
  print(a);
}

但是對(duì)于 const [1, 2, 3] 中的單個(gè)數(shù)據(jù)元素是不可修改的,修改會(huì)拋出異常馋贤。對(duì)于 a 變量來(lái)說(shuō)是可變的赞别,因?yàn)槲词褂?const 修飾,所以對(duì) a 重新賦值 [4, 5, 6] 以后配乓,a 對(duì)象相當(dāng)于如下定義:

var a = [4, 5, 6];

通過(guò)以下代碼驗(yàn)證:

main(){  
  var a = const [1, 2, 3];
  var b = const [4, 5, 6];
  a = [4, 5, 6];
  if(a == b) {
    print("相同");
  }else{
    print("不同");   //輸出不同
  }
}

以下代碼為對(duì) const [1, 2, 3] 單個(gè)元素修改拋出異常的示例:

main(){  
  var a = const [1, 2, 3];
  a[0] = 10;   //錯(cuò)誤仿滔,不可修改
}

2.1.9 動(dòng)態(tài)數(shù)據(jù)類型

在確定數(shù)據(jù)類型以后再賦值其他數(shù)據(jù)類型則會(huì)報(bào)錯(cuò)惠毁,如下:

main(){
  var a = 10;
  a = 20.1;   //錯(cuò)誤
}

上面的代碼會(huì)報(bào)錯(cuò)如下錯(cuò)誤:

A value of type 'double' can't be assigned to a variable of type 'int'.
Try changing the type of the variable, or casting the right-hand type to 'int'.dart(invalid_assignment)

如果希望變量在賦值一個(gè)數(shù)據(jù)類型以后再賦值其他數(shù)據(jù)類型,可以使用關(guān)鍵字 dynamic 定義崎页,如下:

main(){
  dynamic a = 10;
  print(a.runtimeType);  //輸出int
  a = 20.1;
  print(a);  //輸出20.1
  print(a.runtimeType);  //輸出double
}

dynamic 的最終數(shù)據(jù)類型為最后賦值的數(shù)據(jù)的類型鞠绰。

2.2.0 枚舉 (enum)

enum Week{
  Monday,
  Tuesday,
  Wednesday
}

main(){  
  var week = Week.Tuesday;
  if(week == Week.Monday){
    print("星期一");
  }else if(week == Week.Tuesday) {
    print("星期二");
  }else if(week == Week.Wednesday) {
    print("星期三");
  }
  
  print(Week.values); //輸出所有枚舉值
  print(Week.Monday.index);  //輸出索引值
  print(Week.Tuesday.index);
  print(Week.Wednesday.index);
}

輸出結(jié)果:

星期二
[Week.Monday, Week.Tuesday, Week.Wednesday]
0
1
2
3. 類型轉(zhuǎn)換
main(){  
  var a = 10;
  var b = 20.5;
  var c = a + b.toInt();  //浮點(diǎn)型轉(zhuǎn)整型
  var d = a.toDouble() + b;  //整型轉(zhuǎn)浮點(diǎn)型
  String e = b.toString();  //浮點(diǎn)型轉(zhuǎn)字符串
  double f = double.parse(e);  //字符串轉(zhuǎn)浮點(diǎn),使用此方法應(yīng)確定字符串可轉(zhuǎn)換為浮點(diǎn)型飒焦,否則會(huì)報(bào)異常蜈膨,如不確定是否可以轉(zhuǎn)換應(yīng)使用tryParse方法,無(wú)法轉(zhuǎn)換會(huì)返回null

  print("$c $d $e $f");
}
4. Objectdynamic 的區(qū)別

因?yàn)樵?Dart 中牺荠,所有內(nèi)容都是從 Object 類擴(kuò)展而來(lái)翁巍,所以可以使用如下方式定義數(shù)據(jù):

Object a = 10;

dynamic 對(duì)比,他們都可以定義一種數(shù)據(jù)類型以后再次賦值其他數(shù)據(jù)類型休雌,如下:

main(){  
  Object a = 10;
  a = "string";
  print(a);  //輸出 string

  dynamic b = 20;
  b = "string"; //輸出 string
  print(b);
}

但是 Object 定義的對(duì)象在調(diào)用方法或?qū)傩允窃詈梢栽诰幾g時(shí)就判斷是否存在指定的方法或?qū)傩裕绮淮嬖阼厩幾g階段就會(huì)報(bào)錯(cuò)驰凛。而 dynamic 動(dòng)態(tài)類型,調(diào)用不存在的方法或?qū)傩缘F耍诰幾g階段不會(huì)報(bào)錯(cuò)恰响,運(yùn)行時(shí)才會(huì)拋出異常,如下:

main(){  
  Object a = 10;
  print(a);

  dynamic b = 20;
  print(b);

  // a.run; 調(diào)用不存在的屬性run涌献,編譯時(shí)就會(huì)提示錯(cuò)誤
  b.run;  //編譯時(shí)不會(huì)提示錯(cuò)誤渔隶,運(yùn)行時(shí)才會(huì)拋出異常
}

PS:以上只是很小一部分內(nèi)容,因?yàn)橐磺薪詫?duì)象洁奈,所以每個(gè)類都有自己的很多屬性與方法间唉,具體可以參看代碼文檔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末利术,一起剝皮案震驚了整個(gè)濱河市呈野,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌印叁,老刑警劉巖被冒,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異轮蜕,居然都是意外死亡昨悼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門跃洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)率触,“玉大人,你說(shuō)我怎么就攤上這事汇竭〈谢龋” “怎么了穴张?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)两曼。 經(jīng)常有香客問(wèn)我皂甘,道長(zhǎng),這世上最難降的妖魔是什么悼凑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任偿枕,我火速辦了婚禮,結(jié)果婚禮上户辫,老公的妹妹穿的比我還像新娘渐夸。我一直安慰自己,他們只是感情好寸莫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布捺萌。 她就那樣靜靜地躺著档冬,像睡著了一般膘茎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酷誓,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天披坏,我揣著相機(jī)與錄音,去河邊找鬼盐数。 笑死棒拂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玫氢。 我是一名探鬼主播帚屉,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漾峡!你這毒婦竟也來(lái)了攻旦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤生逸,失蹤者是張志新(化名)和其女友劉穎牢屋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體槽袄,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙无,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遍尺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片截酷。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乾戏,靈堂內(nèi)的尸體忽然破棺而出合搅,到底是詐尸還是另有隱情多搀,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布灾部,位于F島的核電站康铭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赌髓。R本人自食惡果不足惜从藤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锁蠕。 院中可真熱鬧夷野,春花似錦、人聲如沸荣倾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舌仍。三九已至妒貌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铸豁,已是汗流浹背灌曙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留节芥,地道東北人在刺。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像头镊,于是被迫代替她去往敵國(guó)和親蚣驼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容