天天看點

dart基礎:和java的簡單差別

基本資料類型

Dart中支援以下資料類型:

  • Numbers
  • Strings
  • Booleans
  • List(也就是數組)
  • Maps

num有2個子類型,int和double.

控制流程

循環,if esle,switch case,try catch等等和java相差不大,有些細微差異,可以在使用時深入了解。

final和const

const和final定義的都是常量,值不能改變,并且在聲明的時候就必須初始化。

但是也有細微差别,簡單來說

  • const定義的是編譯時常量,隻能用編譯時常量來初始化
  • final定義的常量可以用變量來初始化

final time = new DateTime.now(); //Ok

const time = new DateTime.now(); //Error,new DateTime.now()不是const常量

關于類和對象

dart中所有的基礎類型、函數、類等等都是繼承自Object,預設值是null,可以調用自有的方法。

類的定義使用class關鍵字,建立對象使用new關鍵字,建立不可變對象需要使用const關鍵字

每個字段都對應一個隐式的Getter和Setter,你可以使用get和set關鍵字擴充功能,如果字段為final或者const的話,那麼它隻有一個getter方法

抽象類

在Dart中類和接口是統一的,類就是接口。如果你想重寫部分功能,那麼你可以繼承一個類,如果你想實作某些功能,那麼你也可以實作一個類。

使用abstract關鍵字來定義抽象類,并且抽象類不能被執行個體化,抽象方法不需要關鍵字,直接以分号 ; 結束即可。

注意:當使用 implements的時候,子類需要重寫父類的成員變量和方法,包括私有的成員和方法.

函數

函數和java成員方法有些差別,但是基本寫法差不多,下面是簡單的例子

String sayHello(String name){

return 'Hello $name!';

}

當沒有指定傳回值時,預設傳回null,如果能推斷類型,可以省略傳回類型。但是建議寫入參類型和傳回類型,這樣友善閱讀和維護。

如果函數體隻有一條表達式,可以使用箭頭文法,=>expr;

于是上面的代碼可以寫成這樣:

sayHello(name) => 'Hello $name!';

還可以定義匿名函數:var sayHello = (name)=>'Hello $name!';

函數閉包

核心就是了解函數也是對象,可以作為函數的傳回類型。

Function makeSubstract(num n){
    return (num i) => n - i;
}

void main(){
    var x = makeSubstract(5);
    print(x(2));
}
           

可選參數

dart中支援命名可選參數和位置可選參數,但是不能同時混用。

  • 命名可選參數使用大括号{},預設值用冒号:
  • 位置可選參數使用方括号[],預設值用等号=

注意:命名可選參數在sdk1.2.1之後可以使用冒号‘:’和等号‘=’來指派預設值。

函數别名

可以使用typedef來定義函數,這樣可以使用這個名字來關聯該函數。

typedef int Compare(int a, int b);
int sort(int a, int b) => a - b;

main() {
  assert(sort is Function);
  assert(sort is Compare);
}
           

總結

從基礎文法和使用習慣來看和java差别很小,當然更深入的差别有待繼續學習。