Dart學習筆記

變量定義

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
更多資料,請搜索公衆號歪歪梯Club

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章