變量定義
Dart中,不像其他語言存在基本類型與類類型,Dart中所有類型(包括int等)都是繼承自Object的類型
字符串字符爲UTF16編碼,小數都爲double類型,函數類型爲Function,布爾類型爲bool
- type variable = val
在定義時指定固定類型type,則該變量類型固定,且只能接收特定類型賦值
比較特殊的,如果type是Object或者dynamic,則該變量可以接收任意類型數值賦值,比如int age = 22 dynamic magic = 1; magic = "text"; //OK Object obj = 2.0; obj = true; //OK
- var variable = val
Dart支持類型推斷,如果使用關鍵字var定義變量,則會推斷爲賦值的數值類型,比如var age = 22; //int 類型
- 變量如果沒有初始化,默認值爲null(即便是基本類型),比如
int value1; print("value1 = $value1"); //內置的print函數執行格式化輸出,通過$變量名輸出對象 //output: value1 = null
final與const
final表示運行期常量,在運行時初始化。
const表示編譯器常量,在編譯前必須指定好初始值。
final修飾的變量只允許被賦值一次,const修飾的變量必須在初始化時賦值,且也不能再次賦值,比如
const a = 1; //自動類型推斷
final b = new DateTime.now(); //自動類型推斷
const int c = 2;
final String d = "yyt";
數組類型
Dart使用List定義數組,可以指定數組元素泛型,不指定默認爲Object
List可以在定義時初始化,則長度爲初始化元素集合長度,也可以通過構造函數指定
通過下標可以直接訪問元素,通過add方法在末尾新增元素
通過[]運算,可以得到一個動態修改長度的List,通過length 屬性可以修改長度,比如
List<String> names = ["aaa","bbb"]; //capacity is 2
List list = List(5); //capacity is 5
list.add(1);
list[0] = 2;
List dynamicList = []; //capacity is dynamic
dynamicList.length = 5;// now capacity is 5
Map類型
Dart通過Map定義鍵值對,鍵值對採用鍵型下標訪問元素
與List相同Map也可以指定泛型,不指定爲<Object,Object>,比如
Map map = {
"name": "yyt",
"age": 22,
3:"text"
};
map[3] = 5;
Map<String,String> strs = {
"a" : "a"
};
函數定義
Dart的函數定義語法爲 returnType name (varible…),比較獨特的爲形參的兩種定義方式,以及Dart允許將函數作爲形參(函數類型爲Function)
- 可選參數
returnType name ({type1 variable1 , type2 variable2}){}
通過一個{}將多個形參定義包圍,代表所有參數都爲可選參數,沒傳遞的參數默認爲null
此種類型定義在調用時傳遞參數需要指定入參的變量名,入參與形參對應關係和位置無關,比如// 函數定義 void show({var name, var age}) { if(name != null) { print("name = $name"); } if(age != null) { print("age = $age"); } } // 函數調用 show(name: "yyt"); // 輸出結果 name = yyt
- 位置參數
returnType name (type1 variable1 , [type2 variable2]){}
位置參數語法與普通語言差別不大,如果某些形參是可選形參,則必須使用[]包含,同時理所應當的,必傳參數需要放在所有可選參數之前,比如// 函數定義 void show(var name, [Function f]) { print("name = $name"); if(f != null) { f(); } } // 函數調用 show("yyt"); // 輸出結果 name = yyt
- 嵌套函數
Dart支持在函數內部定義函數,比如void f1(){ void f2(){} f2(); }
入口函數
與其他語言相同,Dart使用main函數作爲入口函數
void main(){}
類與構造函數
Dart的類可以被繼承(extends),也可以被實現(implements)
Dart也提供複雜結構類型的定義語法,通過class關鍵字
類中成員定義語法爲 [static] type variable,被static修飾成員代表靜態成員,是共享變量
類除了可以使用默認的同名無返回值函數作爲構造函數,還可以定義 類名.xyzxxx格式的無返回值函數作爲構造函數,比如
class A {
static int a = 1;
int b = 2;
A(int b){
this.b = b;
}
A.b(this.b); //簡略寫法,功能等價於入參賦值給成員b
}
A a = A(1);
A a = A.b(2);
抽象類
Dart中使用abstract class定義抽象類
抽象類中可以定義沒有方法體的抽象方法
抽象類不能被實例化
abstract class Study {
void study();
}
繼承與實現
抽象類與類都可以被作爲接口進行實現,當一個類被用來實現,其成員僅結構起作用,而方法實現都無關係(因爲實現類不能複用代碼,必須重新實現該成員結構)
一個類 / 抽象類可以實現多個抽象類,但是隻能繼承一個類 / 抽象類
Dart中通過extends關鍵字進行繼承,Dart允許通過mixin實現僞多繼承
- 繼承構造
子類構造函數默認繼承父類構造函數(隱式調用)
通過在子類構造函數形參列表後使用:可以修改要使用的父類構造函數,比如class A { int b = 2; A (int b) { this.b = b; } A.b(this.b); } class SubA { SubA(int b) : super.b(b) { } }
- 繼承與實現
繼承一個類 / 抽象類,則會自動繼承其所有結構(代碼複用)。
而實現一個 類 / 抽象類 ,代碼不會複用,需要在實現類中編寫滿足被實現 類/抽象類 所有成員的成員結構進行實現,比如// 父類1 class SupperClass1{ void say(){ } } // 子類1通過extends 繼承父類1的方法 class SubClass1 extends SupperClass1{ } SubClass1 s1 = SubClass1(); s1.say(); //OK , extends // 父類2 class SupperClass2{ void say(){ } } // 子類2通過implements 實現父類2,要滿足父類2的規範 class SubClass2 implements SupperClass2{ @override void say(){ //必須創建say方法 } } SubClass2 s2 = SubClass2(); s2.say(); //OK , implements
mixin繼承
Dart提出mixin多繼承,通過with關鍵字關聯多個類 / 抽象類 進行mixin繼承
mixin繼承解決多繼承同名同類型成員衝突的規則是,如果當前類中,包含該同名同類型成員,則使用當前類成員,否則使用離with關鍵字最優、實現了該同名同類型成員的類中的成員,比如
class A {
void say(){}
}
abstract class B {
void say();
}
class C with A,B{
}
class D with A,B,C{
void say(){}
}
C c = C();
c.say(); //use say function in B
D d = D();
d.say(); //use say function in D
泛型
Dart也支持類似於java的類泛型和方法泛型,比如
tips:方法泛型的作用就是爲了在調用指定方法時傳遞,覆蓋類泛型
class A<T>{
T val;
void f<K,T>(K k,T t){
}
}
類型轉化與類型判斷
Dart使用as進行對象的強制類型轉化,失敗會拋出異常
Dart使用is進行對象的類型判斷,返回布爾類型數值,比如
class A{}
class B{
int age;
}
A a = A();
bool val = (a is B);
(a as B).age = 5; //error
異常處理
Dart支持類似java的異常處理機制(try-catch-finally)
finally可以沒有,即便在try或者catch中調用return,finally也會在方法返回前執行
void doSth() => throw Exception("error!");
try {
doSth();
} on Exception catch(e) {
print(e);
} finally {
print("finally");
}
更多文章,請搜索公衆號歪歪梯Club