Dart 語(yǔ)法篇(全)

Dart語(yǔ)言簡(jiǎn)介

對(duì)于Dart這一門語(yǔ)言,百度百科是這么解釋的:Dart是谷歌開發(fā)的計(jì)算機(jī)編程語(yǔ)言,它被應(yīng)用于web苔咪、服務(wù)器、移動(dòng)應(yīng)用和物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)柳骄,它是面向?qū)ο笸派汀㈩惗x、單繼承的語(yǔ)言耐薯,當(dāng)然啦~ 樓主來(lái)了解這個(gè)語(yǔ)言就是為了了解用Dart來(lái)開發(fā)的Flutter應(yīng)用舔清。

Dart SDK 和 IDE的安裝

要學(xué)某種語(yǔ)言,首先當(dāng)然是SDK 和 IDE的安裝
Dart SDK的安裝可以參考官網(wǎng)的命令來(lái)安裝:Dart官網(wǎng)
??:如果在安裝的過程中出錯(cuò)曲初,可以看看https://blog.csdn.net/qq_40028324/article/details/105692357這篇文章能否幫你解決問題(畢竟樓主是依靠這篇文章來(lái)解決問題的 親測(cè)有效~)

關(guān)于Dart的開發(fā)工具選擇比較多体谒,有IDEA、VS Code 等 樓主這里使用的是IDEA 每個(gè)開發(fā)工具的具體安裝參考官網(wǎng)即可臼婆,由于樓主使用的是IDEA抒痒,我這里就拿IDEA來(lái)舉例。

安裝IDEA之后颁褂,打開IDEA故响,搜索Dart插件安裝,到此 我們的Dart整個(gè)開發(fā)環(huán)境就搭建好了颁独,接著就要進(jìn)入正題了~

Hello World

// main 方法是程序入口
void main() {
print("Hello World"); // 輸出:Hello World
}

一彩届、Dart中的數(shù)據(jù)類型

1、變量和常量

變量:var
常量:const ??:使用const聲明的必須是編譯期變量
關(guān)鍵字final:聲明只能賦值一次的變量
??:

void main() {
  var a = 10;
  final b = 20;
  const c = 30;
}

2誓酒、數(shù)值型:num

num 只有int 和 double兩種類型
常用的操作:+ - * / % ~/
常用屬性:isNaN(是否不是數(shù)字)樟蠕,isEven,isOdd......
??:

void main() {
  num a = 12.5;
  int b = 20;

  print(b ~/a); // 1  ~/表示除之后對(duì)結(jié)果取整
  print(b/a); // 1.6   
  print((0.0/0.0).isNaN); // true
  print(b.isEven);// 是否是偶數(shù) true
  print(b.isOdd);// 是否是奇數(shù) false

}

3、字符串:String

""''都可以創(chuàng)建字符串
"""''' 創(chuàng)建多行的字符串
r創(chuàng)建一個(gè)原始的字符串
常用操作:+ * == []
常用屬性:length寨辩、isEmpty寂汇、split()......
插值表達(dá)式:${expression}
??:

void main () {
  String str0 = "Hello"; // ''
  String str1 = '''Hello
  World!!!''';
  String str2 = r'Hello \n Dart';

  String str3 = 'Hello';
  String str4 = str3 + ' World';

  print(str0);
  print(str1);
  print(str2); // Hello \n Dart
  print(str4); // Hello World
  print(str3 * 2); // HelloHello
  print(str3 == str4); // false
  print(str3[4]); // o

  int a = 1;
  int b = 2;
  print("a + b = ${a+b}"); // a + b = 3
  print(str4.substring(0,3)); // Hel
  print(str4.split(' '));// [Hello, World]
  
}

4、布爾類型:bool

true捣染、false

5骄瓣、列表(數(shù)組):List

構(gòu)造創(chuàng)建:var list = new List();
??:

void main () {

  var list = [1,2,3,"Dart",false]; // list里面的元素可以是多種類型 不要求是同一種類型
  print(list); // [1,2,3,"Dart",false]

  var list1 = const [1,2,3];
  // list1[1] = 6; // 運(yùn)行會(huì)報(bào)異常

  list.insert(0, 999); 
  print(list); // [999,1,2,3,"Dart",false]

  // 遍歷List
  list.forEach((element) {
    print(element);
  });
  
  print(list.indexOf(6)); // 如果沒有找到對(duì)應(yīng)的元素 返回結(jié)果是 -1

  var list2 = new List();
}

6、鍵值對(duì):Map

創(chuàng)建Map:var language = {'first':''Dart,'second':'Java'};
創(chuàng)建不可變的Map:var language = const {'first':''Dart,'second':'Java'};
構(gòu)造創(chuàng)建:var language = new Map();
常用的屬性耍攘、操作:length榕栏、keys、values蕾各、forEach(遍歷)扒磁、containsKey(是否包含某個(gè)key)......
asMap():把list轉(zhuǎn)成map
??:

void main() {

  var map0 = {"first":"Dart",1:true, true:666,"OC":null};// key 和 value 都可以是任意類型
  print(map0["OC"]);// null

  var map = {"first":"Dart","second":"Swift","third":"Java"};
  map.forEach(func);

  var list = ["Dart","Swift","Java"];
  print(list.asMap()); // {0: Dart, 1: Swift, 2: Java}
}

void func(key,value) {
  print("key = $key, value = $value");
}

7、dynamic(動(dòng)態(tài)型)

??:

void main() {

  var a;
  a = 10;
  a = "Dart";

  dynamic b = 10; // dynamic 表示是動(dòng)態(tài)類型 如果寫int b = 10; b = "Dart"是會(huì)報(bào)錯(cuò)的 因?yàn)閕nt b = 10 默認(rèn)b就是int類型
  b = "Dart";
}

二式曲、運(yùn)算符

1妨托、算術(shù)運(yùn)算符

常用的操作:+、-吝羞、*兰伤、/、~/钧排、%
遞增遞減:++var敦腔、var++、--var恨溜、var--
??:

void main () {

  int a = 1;
  print(a + 1); // 2
  print(a++); // 1
  print(a); // 2
  print(--a);// 1
}

2符衔、關(guān)系運(yùn)算符

運(yùn)算符:==、!=糟袁、>判族、<、>=项戴、<=

3形帮、邏輯運(yùn)算符

運(yùn)算符:!肯尺、&&沃缘、||

4、賦值運(yùn)算符

基礎(chǔ)運(yùn)算符:=则吟、??=
復(fù)合運(yùn)算符:+=槐臀、 -= 、/= 氓仲、*= 水慨、%= 得糜、~/=
??:

void main () {
  int a = 10;
  int b;
  // ??= 表示如果有值就是原來(lái)的值 如果沒有值就是賦的值
  b ??= 20;
  print(b); // 20
  int c = 10;
  c ??= 20;
  print(c); // 10
  print(a ~/= 5); // 2
}

5、條件表達(dá)式

三目運(yùn)算符:?:
??運(yùn)算符:expre1 ?? expre2 表示如果第一個(gè)表達(dá)式為nil 則取第二個(gè)表達(dá)式
??:

void main () {
  String a;
  String b = "Dart";
  String c = a ?? b;
  print(c); // Dart

}

三晰洒、控制語(yǔ)句

1朝抖、if 、if else

2谍珊、for 循環(huán)治宣、for...in 語(yǔ)句

??:

void main () {
  var list = [1,2,3,4,5,6];
  for(int index = 0; index < list.length; index++) {
    // print(list[index]);
  }

  for(var item in list) {
    print(item);
  }
  
}

3、while砌滞、do...while

??:

void main() {

  int count = 0;
  while(count < 5) {
    print(count++); // 0 1 2 3 4
  }
  // count = 5

  do {
    print(count --);
  }while(count > 0 && count < 5); // 5 4 3 2 1
}

4侮邀、break、continue

break:終止循環(huán)
continue:跳出當(dāng)前循環(huán)
??:

void main () {
  var list1 = [1,2,3];
  var list2 = [4,5,6];
  for(var item1 in list1) {
    for(var item2 in list2) {
      if(item2 == 5) {
        // break; // 4 4 4
        continue; // 46 46 46
      }
      print(item2);
    }
  }
}

5贝润、switch...case語(yǔ)句

5.1 比較類型:num绊茧、String、編譯期常量打掘、對(duì)象华畏、枚舉
5.2 非空case必須有一個(gè)break
5.3 使用default來(lái)處理默認(rèn)情況
5.4 可以用continue來(lái)加一個(gè)跳轉(zhuǎn)標(biāo)簽(其他語(yǔ)言沒有的)
??:

void main () {

  String language = "Python";
  switch(language) {
    Test: // 標(biāo)簽隨便定義的
    case "Java":
      print("Java");
      break;
    case "Dart":
      print("Dart");
      break;
    case "Python":
      print("Python");
      continue Test;
      // break;
    default:
      print("None");
  }
  
  // 輸出結(jié)果是:Python、Java
}

四、方法

1、方法的定義

返回類型 方法名 (參數(shù)1,參數(shù)2...){
方法體...
return 返回值
}

2、方法特性

2.1 方法也是對(duì)象 并且具有具體的類型Function
2.2 方法的返回值絮供、參數(shù)類型都可以省略
2.3 方法都有返回值 如果沒有返回值默認(rèn)是null
??:

void main (List args) {
  printPerson("Sunny", 18); // 輸出:name = Sunny,age = 18
}

 printPerson (name, age) {
   print("name = $name,age = $age");
 }

2.4 箭頭語(yǔ)法: => expre 是return{expre}的縮寫 ??:只適用于一個(gè)表達(dá)式
??:

void main (List args) {
  print(printPerson("Sunny", 18)); // 輸出:name = Sunny盯仪,age = 18
}

printPerson (name, age) => "name = $name,age = $age";

3忍饰、可選參數(shù)

3.1可選命名參數(shù):{params1,params2耐版,params3...}
3.2 可選位置參數(shù):[params1祠够,params2,params3...]
??:

void main () {

  printPerson("Sunny",age: 20);

  printPerson2("Sunshine",20,"Male");
}

// 可選命名參數(shù){}
printPerson(String name,{int age, String gender}) {
  print("name = $name, age = $age, gender = $gender"); // 打印結(jié)果:name = Sunny, age = 20, gender = null

}

// 位置可選參數(shù)[]
printPerson2(String name,[int age, String gender]) {
  print("name = $name, age = $age, gender = $gender"); // 打印結(jié)果:name = Sunny, age = 20, gender = Male

}

??:如果存在可選參數(shù) 可選參數(shù)必須要在必選參數(shù)后面

4粪牲、默認(rèn)參數(shù)值

使用=在可選參數(shù)指定默認(rèn)值 默認(rèn)參數(shù)值只能是編譯期常量
??:

void main () {

  printPerson("Sunny",gender: "Male");

}

// 可選命名參數(shù){}
printPerson(String name,{int age = 20, String gender = "Female"}) {
  print("name = $name, age = $age, gender = $gender"); // 打印結(jié)果:name = Sunny, age = 20, gender = Male

}

5古瓤、方法對(duì)象

5.1 方法可以作為對(duì)象賦值給其他的對(duì)象
??:

void main() {

  var func = printHello;
  func();

  List list = [1,2,3,4];
  list.forEach(print);// 輸出:1,2腺阳,3落君,4

void printHello() {
  print("Hello Dart");
}

5.2 方法可以作為參數(shù)傳遞給其他方法
??:

void main() {
  print(listPrint(["D","a","r","t"], timers)); // 打印結(jié)果:[DDD,aaa,rrr,ttt]
}

// 傳入一個(gè)字符串 把這個(gè)字符串打印3次
String timers (str) {
  return str * 3;
}

List listPrint(List list,timers) {
  for(int index = 0; index < list.length; index++) {
    list[index] = timers(list[index]);
  }
  return list;
}

6、匿名方法

匿名方法的特性:
6.1 可賦值給變量 通過變量來(lái)進(jìn)行調(diào)用
6.2 可以在其他方法中直接調(diào)用或傳遞給其他的方法

(參數(shù)1亭引,參數(shù)2) {
方法體
return 返回值
}

??:

void main () {

  var func = (){
    print("Hello Dart");
  };
  func();

  print(listPrint(["1","2","3","4"], (str){ return str*3;}));// 打印結(jié)果:[111,222,333,444]
}

List listPrint(List list,timers) {
  for(int index = 0; index < list.length; index++) {
    list[index] = timers(list[index]);
  }
  return list;
}

7绎速、閉包

閉包也是一個(gè)方法(對(duì)象),閉包定義在其他方法內(nèi)部焙蚓,閉包能夠訪問外部變量的局部變量 并持有其狀態(tài)
??:

void main() {

  var func = funca();
  func(); // 0
  func(); // 1
  func(); // 2
}

funca () {
  int count = 0;
  printCount() {
    print(count++);
  }
  return printCount;
}

也可以是下面的寫法:

void main() {

  var func = funca();
  func(); // 0
  func(); // 1
  func(); // 2
}

funca () {
  int count = 0;
  return () {
    print(count++);
  };
}

五纹冤、Dart面向?qū)ο缶幊?/h2>

1洒宝、類與對(duì)象

使用關(guān)鍵詞class來(lái)聲明一個(gè)類
使用關(guān)鍵字new來(lái)創(chuàng)建一個(gè)類 new可忽略
所有的對(duì)象默認(rèn)都繼承Object

屬性與方法:
默認(rèn)會(huì)生成settergetter
使用final關(guān)鍵字聲明的屬性 只會(huì)生成getter
在Dart中方法是不能被重載的

類及成員的可見性:
在Dart中的可見性是一以library為單位的
默認(rèn)情況下 每一個(gè)Dart文件就是一個(gè)庫(kù)library
使用表示庫(kù)的私有性(表示屬性、方法的私有性也是通過來(lái)表示的)
使用import導(dǎo)入庫(kù)
??:

import 'person.dart';

void main() {
  var person =  new Person();
  person.name = "Sunny";
  person.age = 18;
  // person.bookName = "123";
  person.work();
  print(person.bookName);
}

// person.dart文件
class Person {
  String name;
  int age;
  final String bookName = "《平凡的世界》";
  void work() {
    print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
  }
}

??:如果Person前面使用了_ 就表示是私有萌京,其他類就找不到這個(gè)類了

class _Person {

}

2雁歌、 計(jì)算屬性

計(jì)算屬性的值是通過計(jì)算得來(lái)的 本身并不存儲(chǔ)值
計(jì)算屬性賦值 其實(shí)是通過計(jì)算轉(zhuǎn)換到其他的實(shí)例變量
??:

void main () {

  var rect = Rectangle();
  rect.width = 10;
  rect.height = 20;
  print(rect.area);

  rect.area = 200;
  print(rect.width);
}

class Rectangle {
  num width;
  num height;
  // 計(jì)算屬性getter
  num get area {
    return width * height;
  }

  // 計(jì)算屬性setter
  set area(value) {
     width = value/ 10;
  }
}

3、構(gòu)造方法

如果沒有自定義的構(gòu)造方法知残,會(huì)有一個(gè)默認(rèn)的構(gòu)造方法
??:

void main() {
  var person = new Person();
}

class Person {
  
// 默認(rèn)的構(gòu)造方法
  Person () {
  }
}

如果存在自定義的構(gòu)造方法靠瞎,則默認(rèn)的構(gòu)造方法就無(wú)效
自定義構(gòu)造方法的寫法一??:

void main() {
  var person =  new Person("Sunny", 18);
  person.work();
}

class Person {
  String name;
  int age;
  void work() {
    print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
  }

  // 構(gòu)造方法
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

自定義構(gòu)造方法的寫法二??:

void main() {
  var person =  new Person("Sunny", 18,"Female");
  person.work();
}

class Person {

  String name;
  int age;
  final gender;
  void work() {
    print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
  }

  Person(this.name, this.age,this.gender) {
    print(this.gender);// Female
  }
}

??:如果對(duì)person的gender賦值,第一種構(gòu)造方法就不能使用求妹,因?yàn)椴荒軐?duì)final修飾的屬性賦值较坛,但是第二種構(gòu)造方式是可以的,因?yàn)榈诙N的構(gòu)造方法賦值是在構(gòu)造方法之前

構(gòu)造方法不能重載扒最,但是可以使用重命名的構(gòu)造方法
??:

void main() {
  var person = new Person.withName("Sunny");
  person.work();
}

class Person {

  String name;
  int age;
  final gender;
  void work() {
    print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
  }

  Person.withName(this.name) {
     print(this.name); // Sunny
  }
}

4丑勤、常量構(gòu)造方法

如果類是不可變的狀態(tài),可以把對(duì)象定義為編譯時(shí)常量
使用const來(lái)聲明構(gòu)造方法吧趣,并且所有變量都是final
使用const聲明對(duì)象法竞,可以省略
??:

void main() {
  const person =  const Person("Sunny", 18,"Female");
  person.work();
}

class Person {
  final name;
  final age;
  final gender;
  void work() {
    print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
  }

  const Person(this.name, this.age,this.gender);

}

5、工廠構(gòu)造方法

工廠構(gòu)造方法類似于設(shè)計(jì)模式里面的工廠模式
在構(gòu)造方法添加factory實(shí)現(xiàn)一個(gè)構(gòu)造方法
在工廠構(gòu)造方法里面可以返回對(duì)象
??:

void main() {

  var logger = Logger("Sunny");
  print(logger.name);
}

class Logger {
  final String name;
  static final Map<String,Logger> _cache = <String, Logger>{};
  factory Logger(String name) {
    if(_cache.containsKey(name)) {
      return _cache[name];
    }else {
      final logger = Logger._internal(name);
      _cache[name] = logger;
      return logger;
    }
  }

  // 表示這個(gè)方法是私有
  Logger._internal(this.name);
}

6强挫、初始化列表

初始化列表會(huì)在構(gòu)造方法之前執(zhí)行
使用岔霸,分隔初始化表達(dá)式
初始化列表常用于設(shè)置final變量的值
??:

void main() {
  // var person =  new Person("Sunny", 18,"Female");
  var person = new Person.withMap({"name":"Sunny","age":18});
  person.work();
}

class Person {
  String name;
  final age;
  final gender;
  void work() {
    print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
  }
  
  Person(this.name, this.age,this.gender);
  Person.withMap(Map map):age = map["age"], gender = map["gender"] {
    this.name = map["name"];
    print("name = $name,age = $age,gender = $gender"); // name = Sunny,age = 18,gender = null
  }

}

7、靜態(tài)成員

使用 static關(guān)鍵字來(lái)實(shí)現(xiàn)類級(jí)別的變量和函數(shù)
靜態(tài)成員不能訪問非靜態(tài)成員俯渤,非靜態(tài)成員可以訪問靜態(tài)成員
類中的常量需要使用static const聲明
??:

void main() {
  var page = Page();
  Page.scrollDown(); // 不能通過page.scrollDown()來(lái)調(diào)用

}

class Page {
  static const maxPage = 10;
  static int currentPage = 1;
  // 下滑
  static void scrollDown() {
    currentPage = 1;
    print("scrollDown...");
  }

  // 上滑
  void scrollUp() {
    currentPage++;
    print("scrollUp...");
  }
}

8呆细、對(duì)象操作符

條件成員訪問:?
類型轉(zhuǎn)換:as
是否是指定類型:is is八匠!
級(jí)聯(lián)操作:..
??:

void main () {
  // Person person;
  // person.work();// 會(huì)報(bào)錯(cuò) 因?yàn)閜erson是空
  // person?.work(); // 不會(huì)報(bào)錯(cuò) 檢查到person是nil 就不往下執(zhí)行

  // var person;
  // person = "Sunny";
  // person = new Person();
  // (person as Person).work();
  // if(person is Person) {
  //   print("person is Person...");
  // }
  // if(person is! Person) {
  //   print("person is String...");
  // }

  var person = new Person();
  person..name = "Sunny"
  ..age = 18
  ..work();

}

class Person {
  String name;
  int age;
  void work() {
    print("working...");
  }
}

9絮爷、對(duì)象call方法(不建議使用)

如果類使用了call()方法 則該類的對(duì)象可以作為方法使用
??:

void main() {

  var person = new Person();
  person("Sunny",18);

}

class Person {
  String name;
  int age;
  call(String name,int age) {
    print("name = $name, age = $age, She is working...");// name = Sunny, age = 18, She is working...
  }
}

10、繼承

使用extends表示繼承一個(gè)類
繼承可以繼承父類可見的方法和屬性梨树,不會(huì)繼承構(gòu)造方法
子類能夠復(fù)寫父類的setter 和 getter
單繼承坑夯、多態(tài)
??:

void main() {

  var student = new Student();
  student.name = "Sunny";
  student.age = 18;
  print(student.isAdult);
  student.study();
  student.run();
}

class Student extends Person {
  void study() {
    print("Student is studying...");
  }

  @override
  bool get isAdult => age >15; // 重寫父類的方法

  @override
  void run() {
    super.run();
    print("Student is running...");
  }
}

Person:

class Person {
  String name;
  int age;
  String _birthday;
  bool get isAdult => age > 18;
  void run () {
    print("person is running...");
  }
}

11、繼承中的構(gòu)造方法

子類的構(gòu)造方法默認(rèn)會(huì)去調(diào)用父類的無(wú)名無(wú)參的構(gòu)造方法
如果父類沒有無(wú)名無(wú)參的構(gòu)造方法 則需要顯式調(diào)用父類的構(gòu)造方法
在構(gòu)造方法參數(shù)后面使用:顯式調(diào)用父類的構(gòu)造方法
??:

void main() {
  var student = new Student("Sunny", 18,"Female");
}

class Person {
  String name;
  int age;
  Person(this.name,this.age);
  Person.initWithNameAndAge(this.name,this.age);
}

class Student extends Person {
  final gender;
  // 方式1
  // Student(String name, int age) : super(name, age);// 使用快捷鍵可以自動(dòng)補(bǔ)全

  // 方式2
  Student(String name, int age,String gender) :gender = gender, super.initWithNameAndAge(name,age);

  // 方式3
  // Student.initWithNameAndAge(String name, int age) : super.initWithNameAndAge(name,age);
}

??:初始化列表和`super`的順序不能交換 會(huì)報(bào)錯(cuò)

構(gòu)造方法的執(zhí)行順序:父類的構(gòu)造方法在子類的構(gòu)造方法開始執(zhí)行之前去調(diào)用

12抡四、抽象類

抽象類使用 abstract表示 不能直接被實(shí)例化
抽象方法不適用 abstract 修飾 無(wú)實(shí)現(xiàn)
抽象類可以沒有抽象方法
有抽象方法的類一定得聲明為抽象類
??:

void main () {
  var student = new Student();
  student.run();
}

abstract class Person {
  void run();
}

class Student extends Person {
  @override
  void run() {
    // TODO: implement run
    print("Student is running....");
  }
}

13柜蜈、接口

在Dart中 類和接口是統(tǒng)一的 類就是接口
每個(gè)類都隱式定義了一個(gè)包含所有實(shí)例成員的接口
如果是復(fù)用已有類的實(shí)現(xiàn) 使用extends
如果只是使用已有類的一些外在行為 使用接口implements
??:

void main () {
  var student = new Student();
  student.run();

}

abstract class Person {
  void run();
}

class Student implements Person {
  @override
  void run() {
    print("Student is running...");
  }
}

14、Mixins

Mixins 類似于 多繼承 是在多繼承中使用一個(gè)類代碼的方式
Mixins不能有顯式聲明構(gòu)造方法
Mixins的類只能繼承自O(shè)bject
使用關(guān)鍵字with連接一個(gè)或多個(gè)mixin
??:

void main () {
  var d = new D();
  d.a(); // 輸出:C...a 跟mixins順序有關(guān) 最后是C 所以會(huì)輸出C類里面a的打印
}

class A {
  void a() {
    print("A....a");
  }
}

class B {
  void a() {
    print("B....a");
  }
  void b() {
    print("B....b");
  }
}

class C {
  void a() {
    print("C....a");
  }
  void c() {
    print("C....c");
  }
}

// 現(xiàn)在 如果希望一個(gè)類D 能夠有ABC三個(gè)類的方法
class D extends A with B,C {

}

15指巡、操作符覆寫

覆寫操作符需要在類中定義:

返回類型 operator 操作符 (參數(shù)1淑履,參數(shù)2...) {
實(shí)現(xiàn)體
return 返回值
}

如果需要覆寫 == 還需要覆寫對(duì)象的hashCode getter方法
??:

void main () {
  var person1 = new Person();
  person1.age = 18;
  var person2 = new Person();
  person2.age = 20;
  print(person1 > person2); // false
}

class Person {
  int age;
  // 覆寫操作符
  bool operator > (Person person) {
    return this.age > person.age;
  }
}

六、枚舉和泛型

1藻雪、枚舉

枚舉是一種有窮序列集的數(shù)據(jù)類型
使用關(guān)鍵字 enum 來(lái)定義一個(gè)枚舉
常用于代替常量 和 控制語(yǔ)句

Dart中枚舉特性:
index 從0開始 依次累加
不能指定原始值
不能添加方法
??:

void main() {
  var cuurentSeason = Season.Summer;
  switch(cuurentSeason) {
    case Season.Spring:
      print("Spring...");
      break;
    case Season.Summer:
      print("Summer...");
      break;
    case Season.Automn:
      print("Automn...");
      break;
    case Season.Winter:
      print("Winter...");
      break;
      Default:
      print("None...");
  }
}

enum Season {
  Spring,
  Summer,
  Automn,
  Winter
}

2秘噪、泛型

Dart中類型是可選的 可使用泛型指定類型
使用泛型能有效的減少代碼的重復(fù)
類的泛型
方法的泛型
??:

void main () {

    var utils = new Utils();
    utils.put<String>("Sunny");
    utils.put<int>(1);
}

class Utils {

  void put<T>(T element) {
    print(element);
  }
  
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阔涉,隨后出現(xiàn)的幾起案子缆娃,更是在濱河造成了極大的恐慌捷绒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贯要,死亡現(xiàn)場(chǎng)離奇詭異暖侨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崇渗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門字逗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宅广,你說(shuō)我怎么就攤上這事葫掉。” “怎么了跟狱?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵俭厚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我驶臊,道長(zhǎng)挪挤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任关翎,我火速辦了婚禮扛门,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纵寝。我一直安慰自己论寨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布爽茴。 她就那樣靜靜地躺著葬凳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闹啦。 梳的紋絲不亂的頭發(fā)上沮明,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音窍奋,去河邊找鬼。 笑死酱畅,一個(gè)胖子當(dāng)著我的面吹牛琳袄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纺酸,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窖逗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了餐蔬?” 一聲冷哼從身側(cè)響起碎紊,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤佑附,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后仗考,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體音同,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年秃嗜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了权均。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锅锨,死狀恐怖叽赊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情必搞,我是刑警寧澤必指,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站恕洲,受9級(jí)特大地震影響取劫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜研侣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一谱邪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庶诡,春花似錦惦银、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至喇澡,卻和暖如春迅栅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晴玖。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工读存, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呕屎。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓让簿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親秀睛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尔当,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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