一、if、else、else if
int score = 43;
if(score >= 90){
if(score == 100){
print("完美");
}else{
print("優(yōu)秀");
}
}else if(score > 60){
print("良好");
}else if(score == 60){
print("及格");
}else {
print("不及格");
}
執(zhí)行結(jié)果:不及格
二、for、forin
var list = [1,2,3,4,5];
for(var index = 0;index < list.length; index++){
print(list[index]);
}
for(var item in list){
print(item);
}
執(zhí)行結(jié)果:
1
2
3
4
5
1
2
3
4
5
三、while、do...while
int count = 0;
while(count < 5){
print(count++);
}
print("-----------$count-------------");
do{
print(count--);
}while(count > 0 && count < 5);
執(zhí)行結(jié)果:
0
1
2
3
4
-----------5-------------
5
4
3
2
1
四、break、continue
var list1 = [1,2,3];
for(var item in list1){
if(item == 2){
break;
}
print(item);
}
執(zhí)行結(jié)果:1
var list1 = [1,2,3];
for(var item in list1){
if(item == 2){
break;
}
print(item);
}
執(zhí)行結(jié)果:
1
3
組合使用,循環(huán)嵌套
var list1 = [1,2,3];
var list2 = [4,5,6];
for(var item1 in list1){
if(item1 == 2){
break;
}
for(var item2 in list2){
if(item2 == 5){
break;
}
print(item2);
}
}
執(zhí)行結(jié)果:4
注意:break只會(huì)跳出break所在最內(nèi)層的循環(huán)
五、switch case
String language = "Java";
switch(language){
case "Dart":
print("Dart is my favorite");
break;
case "Java":
print("Java is my favorite");
break;
case "Python":
print("Python is my favorite");
break;
default:
print("None");
}
執(zhí)行結(jié)果:Java is my favorite
特殊用法:語(yǔ)法——continue+標(biāo)簽
程序會(huì)直接跳轉(zhuǎn)到標(biāo)簽標(biāo)識(shí)的case位置繼續(xù)執(zhí)行
String language = "Java";
switch(language){
Tag:
case "Dart":
print("Dart is my favorite");
break;
case "Java":
print("Java is my favorite");
continue Tag;
case "Python":
print("Python is my favorite");
break;
default:
print("None");
}
執(zhí)行結(jié)果:
Java is my favorite
Dart is my favorite
先執(zhí)行case "Java",打?。骸癑ava is my favorite”,之后continue Tag,程序跳轉(zhuǎn)到名字為T(mén)ag的標(biāo)簽位置,Tag標(biāo)識(shí)在case "Dart"之前,程序便跳轉(zhuǎn)到case "Dart"繼續(xù)執(zhí)行,打?。骸癮rt is my favorite”
六、類(lèi)與對(duì)象,聲明、創(chuàng)建及基本特征
1、聲明與創(chuàng)建
- 類(lèi)與對(duì)象
- 使用關(guān)鍵字class聲明類(lèi)
- 使用關(guān)鍵字new創(chuàng)建對(duì)象,new可省了
var person = Person();
2、Dart 類(lèi)的特性
- 屬性默認(rèn)生成getter和setter方法
- 使用final聲明的屬性只有g(shù)etter方法
- 屬性和方法通過(guò).訪(fǎng)問(wèn)
- 方法不能被重載
class Person{
String name;
int age;
void work(){
print("Name is $name,Age is $age,He is working...");
}
}
var person = Person();
person.age = 12;
person.name = "tom";
print(person.age);
person.work();
3、計(jì)算屬性
- 顧名思義,計(jì)算屬性的值是通過(guò)計(jì)算而來(lái),本身并不存儲(chǔ)值
- 計(jì)算屬性的賦值,其實(shí)是通過(guò)計(jì)算轉(zhuǎn)換到其他的實(shí)例變量
class Rectangle{
num width,height;
num get area => width * height;
}
var rect = Rectangle();
rect.height = 20;
rect.width = 10;
print(rect.area);//200
七、構(gòu)造方法及初始化列表
1、構(gòu)造方法
- 如果沒(méi)有自定義構(gòu)造方法,則會(huì)有個(gè)默認(rèn)構(gòu)造方法
- 如果存在自定義構(gòu)造方法,則默認(rèn)構(gòu)造方法無(wú)效
- 構(gòu)造方法不能重載
class Boy{
String name;
int age;
Boy(String name, int age){
this.name = name;
this.age = age;
print("Name is $name,Age is $age");
}
void work(){
print("Name is $name,Age is $age,He is working...");
}
}
若存在final屬性:
class Boy{
String name;
int age;
final String gender;
Boy(String name, int age,this.gender){
this.name = name;
this.age = age;
print("Name is $name,Age is $age");
}
void work(){
print("Name is $name,Age is $age,He is working...");
}
}
此時(shí)屬性賦值在構(gòu)造函數(shù)之前執(zhí)行
構(gòu)造方法語(yǔ)法糖:
Boy(this.name,this.age,this.gender);
同理屬性賦值在構(gòu)造函數(shù)之前執(zhí)行
命名構(gòu)造方法:
由于構(gòu)造方法無(wú)法重載,要想給部分屬性賦值時(shí),可以采用賦值構(gòu)造方法
class Boy{
String name;
int age;
inal String gender;
Boy(String name, int age,this.gender){
this.name = name;
this.age = age;
print("Name is $name,Age is $age");
}
Boy.withGender(this.gender);
void work(){
print("Name is $name,Age is $age,He is working...");
}
}
var boy = Boy.withGender("男");
boy.work();
常量構(gòu)造方法:
- 如果類(lèi)是不可變狀態(tài),可以把對(duì)象定義為編譯時(shí)常量
- 使用const聲明構(gòu)造方法,并且所有變量都為final
- 使用const聲明對(duì)象,可以省略
class Dog{
final String name;
final int age;
const Dog(this.name,this.age);
}
工廠構(gòu)造方法:
- 工廠構(gòu)造方法類(lèi)似于設(shè)計(jì)模式中的工廠模式
- 在構(gòu)造方法錢(qián)添加關(guān)鍵字factory實(shí)現(xiàn)一個(gè)工廠構(gòu)造方法
- 在工廠構(gòu)造方法中可返回對(duì)象
class Factory{
String message;
factory Factory(String message){
//message為dart時(shí),實(shí)例化,否則返回空
if(message == "dart"){
return Factory.internal(message);
}else{
return null;
}
}
Factory.internal(this.message);
}
var factory = Factory("Java");
print(factory == null);//true
2、初始化列表
用于解決構(gòu)造方法傳入集合時(shí),final變量的賦值問(wèn)題
- 初始化列表會(huì)在構(gòu)造方法體執(zhí)行之前執(zhí)行
- 使用逗號(hào)分隔初始化表達(dá)式
- 初始化列表常用于設(shè)置final變量的值
class Girle{
String name;
int age;
final String gender;
Girle.withMap(Map map) : gender = map["gender"]{
this.name = map["name"];
this.age = map["age"];
}
void work(){
print("Name is $name,Age is $age,Gender is $gender,She is working...");
}
}
var map = {"name":"tom","age":12,"gender":"女"};
var girle = Girle.withMap(map);
girle.work();
八、靜態(tài)成員及對(duì)象操作符的使用
1、靜態(tài)成員
- 使用static關(guān)鍵字來(lái)實(shí)現(xiàn)類(lèi)級(jí)別的變量和函數(shù)
- 靜態(tài)成員不能方位非靜態(tài)成員,非靜態(tài)成員可以訪(fǎng)問(wèn)靜態(tài)成員
- 類(lèi)中的常量需要使用static const聲明
class Page{
static const int maxPage = 10;
static int currentPage = 1;
static void up(){
currentPage++;
print("currentPage = $currentPage");
}
static void down(){
currentPage--;
print("currentPage = $currentPage");
}
}
Page.up();//currentPage = 2
Page.down();//currentPage = 1
2、對(duì)象操作符
條件成員訪(fǎng)問(wèn):?.
相當(dāng)于在執(zhí)行之前進(jìn)行判空操作,如果為null則不再執(zhí)行
var person;
person?.age = 12;
此時(shí)如果不適用?.則會(huì)crash
類(lèi)型轉(zhuǎn)換:as
person = "";
person = Person();
(person as Person).age = 12;
是否指定類(lèi)型:"is & is! "用于判斷對(duì)象的class
if(person is Person){
person.age = 12;
}
級(jí)聯(lián)操作
person..name = "小李"
..age = 26
..work();
九、對(duì)象call方法
如果類(lèi)實(shí)現(xiàn)了call()方法,則該類(lèi)的對(duì)象化可以作為方法使用
class Animal{
String call(name,age)=>"Name is $name, age is $age";
}
var animal = Animal();
print(animal("小貓",1));//Name is 小貓, age is 1
十、繼承、繼承中的構(gòu)造函數(shù)
- 鍵字extends繼承一個(gè)類(lèi)
- 子類(lèi)會(huì)繼承父類(lèi)可見(jiàn)的屬性和方法,不會(huì)繼承構(gòu)造方法
- 子類(lèi)能夠復(fù)寫(xiě)父類(lèi)的方法、getter和setter
- 單繼承
class Person {
String name;
int age;
String _birthday;
bool get isAdult => age > 18;
void run(){
print("Person run...");
}
}
class Student extends Person{
@override
bool get isAdult => age > 15;
@override
void run(){
print("Student run...");
}
@override
String toString(){
return("Student toString");
}
void study(){
print("Student study...");
}
}
- 繼承中的構(gòu)造方法
- 子類(lèi)的構(gòu)造方法默認(rèn)會(huì)調(diào)用父類(lèi)無(wú)名無(wú)參的構(gòu)造方法
- 如果父類(lèi)沒(méi)有無(wú)名午餐的構(gòu)造方法,則需要顯示調(diào)用父類(lèi)構(gòu)造方法
- 在構(gòu)造方法參數(shù)后使用:顯示調(diào)用父類(lèi)構(gòu)造方法
class Person {
String name;
int age;
String _birthday;
bool get isAdult => age > 18;
Person(this.name);
Person.withName(this.name);
void run(){
print("Person run...");
}
}
class Student extends Person{
Student(String name) : super(name);
}
- 構(gòu)造方法執(zhí)行順序
- 父類(lèi)的構(gòu)造方法在子類(lèi)構(gòu)造方法體開(kāi)始執(zhí)行的位置調(diào)用
- 如果有初始化列表,初始化列表會(huì)在父類(lèi)構(gòu)造方法之前執(zhí)行
class Person {
String name;
int age;
bool get isAdult => age > 18;
Person(this.name);
Person.withName(this.name);
void run(){
print("Person run...");
}
}
class Student extends Person{
final String gender;
Student(String name,String g) : gender = g,super(name);
}
十一、抽象類(lèi)
- 抽象類(lèi)使用abstract標(biāo)識(shí),不能直接被實(shí)例化
- 抽象方法不用abstract修飾,無(wú)實(shí)現(xiàn)
- 抽象類(lèi)可以沒(méi)有抽象方法
- 有抽象方法的類(lèi)一定得聲明為抽象類(lèi)
abstract class Person{
void run();
}
class Student extends Person{
@override
void run(){
print("run...");
}
}
十二、接口
- 類(lèi)和接口是統(tǒng)一的,類(lèi)就是接口
- 每個(gè)類(lèi)都隱式定義了一個(gè)包含所有實(shí)例成員的接口
- 如果是復(fù)用已有類(lèi)的實(shí)現(xiàn),使用繼承(extends)
- 如果只是使用已有類(lèi)的外在行為,使用接口(implements)
class Person {
String name;
int age;
void run(){
print("Person run...");
}
}
class Student implements Person{
@override
String name;
@override
int age;
@override
void run(){
print("run...");
}
}
建議使用抽象類(lèi)作為接口
abstract class Person{
void run();
}
class Student implements Person{
@override
void run(){
print("run...");
}
}
十三、Mixins,操作符的覆寫(xiě)
1、Mixins
- Mixins類(lèi)似于多繼承,是在多類(lèi)繼承中重用一個(gè)類(lèi)代碼的方式,Mixin不能直接使用,必須配合繼承
- 作為Mixin的類(lèi)不能有顯示聲明構(gòu)造函數(shù)
- 作為Mixin的類(lèi)智能繼承自O(shè)bject
- 使用關(guān)鍵字with連接一個(gè)或多個(gè)mixin
順序問(wèn)題
- 如果2個(gè)或多個(gè)超類(lèi)擁有相同簽名的A方法,那么子類(lèi)會(huì)以繼承的最后一個(gè)超類(lèi)中的A方法為準(zhǔn)。
- 若子類(lèi)也重寫(xiě)了改方法也已子類(lèi)為準(zhǔn)
- 優(yōu)先級(jí)順序是:子類(lèi)自己實(shí)現(xiàn)>Mixin>繼承,如果有多個(gè)Mixin,則已最后的Mixin為主
class A {
String getMessage() => 'A';
}
class B {
String getMessage() => 'B';
}
class P {
String getMessage() => 'P';
}
class AB extends P with A, B {}
class BA extends P with B, A {}
class C extends P with B, A {
String getMessage() => 'C'; //優(yōu)先級(jí)最高的是在具體類(lèi)中的方法。
}
//關(guān)系連接:implements實(shí)現(xiàn)、extends繼承、with混入
class CC extends P with B implements A {
}
var cc = CC();
print(cc.getMessage());//=>B
使用mixin進(jìn)行類(lèi)組合
abstract class Person{
String name;
int age;
void run();
}
class Animal{
void eat(){
print("eat...");
}
}
//mixin on的使用,使用這個(gè)mixin的class必須繼承自Animal
mixin Boy on Animal implements Person{
@override
String name;
@override
int age;
@override
void run(){
print("Person run...");
}
void playBall(){
print("playBall...");
}
}
mixin Girle implements Person {
@override
String name;
@override
int age;
@override
void run(){
print("Person run...");
}
void dance(){
print("dance...");
}
}
class Cat{
void eat(){
print("eat...");
}
}
此時(shí)我們可以使用快捷方式組合class
class A = Cat with Girle;
var a = A();
a.run();
2、操作符的覆寫(xiě)
- 操作符覆寫(xiě)
- 覆寫(xiě)需要在類(lèi)中定義
返回類(lèi)型 operator操作符(參數(shù)1、參數(shù)2.....){
實(shí)現(xiàn)體
return 返回值
}
class Person {
int age;
bool operator > (Person person){
return this.age > person.age;
}
}
var p1= Person();
p1.age = 18;
var p2= Person();
p2.age = 13;
print(p1>p2);//ture
十四、方法
1、方法定義
- 法也是對(duì)象,并且有具體類(lèi)型Function
- 返回類(lèi)型、參數(shù)類(lèi)型都可以省略
- 箭頭語(yǔ)法:=> expr 是{return expr;}縮寫(xiě)。只適用于一個(gè)表達(dá)式
- 方法都有返回值。如果沒(méi)有制定,默認(rèn)return null左后一句執(zhí)行
//方法也是對(duì)象,并且有具體類(lèi)型Function
String getPerson(String name, int age){
return "名字:$name,年齡:$age";
}
printPerson(name,age){
print("名字:$name,年齡:$age");
}
//=>語(yǔ)法
getPerson1(name, age) => "名字:$name,年齡:$age";
print(getPerson('張三',12));
printPerson('張三',12);
print(getPerson1('張三',12));
2、可選參數(shù)
- 可選命名參數(shù):{param1,param2,…}
- 可選位置參數(shù):[param`,param2,…]
//1、可選命名參數(shù){param1,...}
printPersionOptional1(name,{age,gender}) => "名字:$name,年齡:$age,性別:$gender";
//2、可選位置參數(shù)[param1,...]
printPersionOptional2(name,[age,gender]) => "名字:$name,年齡:$age,性別:$gender";
注意:可選參數(shù)必須在具體參數(shù)之后?。?!
3、默認(rèn)參數(shù)
- 使用=在可選參數(shù)指定默認(rèn)值
- 默認(rèn)值只能是編譯時(shí)常量
//默認(rèn)參數(shù)
printPersionOptionalDefault(name,{age=12,gender="男"}) => "名字:$name,年齡:$age,性別:$gender";
歸納代碼:
//要達(dá)到可選命名參數(shù)的用法,那就在定義函數(shù)的時(shí)候給參數(shù)加上 {}
void enable1Flags({bool bold, bool hidden}) => print("$bold , $hidden");
//定義可選命名參數(shù)時(shí)增加默認(rèn)值
void enable2Flags({bool bold = true, bool hidden = false}) => print("$bold ,$hidden");
//可忽略的參數(shù)在函數(shù)定義時(shí)用[]符號(hào)指定
void enable3Flags(bool bold, [bool hidden]) => print("$bold ,$hidden");
//定義可忽略參數(shù)時(shí)增加默認(rèn)值
void enable4Flags(bool bold, [bool hidden = false]) => print("$bold ,$hidden");
//可選命名參數(shù)函數(shù)調(diào)用
enable1Flags(bold: true, hidden: false); //true, false
enable1Flags(bold: true); //true, null
enable2Flags(bold: false); //false, false
//可忽略參數(shù)函數(shù)調(diào)用
enable3Flags(true, false); //true, false
enable3Flags(true,); //true, null
enable4Flags(true); //true, false
enable4Flags(true,true); // true, true
4、對(duì)象方法
- 方法可作為對(duì)象賦值給其他變量
- 方法可作為參數(shù)傳遞給其他方法
void printHrello(){
print("Hello");
}
void printDoubleNumber(num){
print(num*5);
}
List listTimes(list,times(str)){
for(var index = 0; index < list.length; index ++){
list[index] = times(list[index]);
}
return list;
}
List listTimes1(list){
var fun = (str)=>str*3;
for(var index = 0; index < list.length; index ++){
list[index] = fun(list[index]);
}
return list;
}
times(str) => str*3;
Function func = printHrello;
func();
var list = [1,2,3,4];
//forEach接收一個(gè)Function類(lèi)型的參數(shù)
list.forEach(print);
list.forEach(printDoubleNumber);
print(listTimes(['a','b','c','d'],times));
執(zhí)行結(jié)果:
Hello
1
2
3
4
5
10
15
20
[aaa, bbb, ccc, ddd]
5、匿名方法
匿名方法特征:
- 可賦值給變量,通過(guò)變量進(jìn)行調(diào)用
- 可在其他方法中直接調(diào)用或傳遞給其他方法
//匿名方法
var func = (str){
print('======= $str');
};
func("Hlelo");
//匿名方法直接執(zhí)行
((){
print('=======');
})();
print(listTimes(['a','b','c','d'],(str)=>str*5));
print(listTimes1(['a','b','c','d']));
6、閉包
- 閉包是一個(gè)方法(對(duì)象)
- 閉包定義在其他方法內(nèi)部
- 閉包能夠訪(fǎng)問(wèn)外部方法內(nèi)的局部變量,并持有其狀態(tài)
a(){
int count = 0;
printCount(){
print(count++);
}
return printCount;
}
var func = a();
func();
func();
func();
func();
執(zhí)行結(jié)果:
0
1
2
3
另一種寫(xiě)法:
a(){
int count = 0;
// printCount(){
// print(count++);
// }
return (){
print(count++);
};
}
執(zhí)行結(jié)果仍然是:
0
1
2
3
十五、枚舉
1、枚舉是一種有窮序列集的數(shù)據(jù)類(lèi)型
2、使用關(guān)鍵字enmu定義一個(gè)枚舉
3、常用于代替常量,控制語(yǔ)句等
enum Season{
spring,
summer,
autumn,
winter
}
void main() {
var currentSeason = Season.spring;
switch(currentSeason){
case Season.spring:
print("1-3月");
break;
case Season.summer:
print("4-6月");
break;
case Season.autumn:
print("7-9月");
break;
case Season.winter:
print("10-12月");
break;
}
}
index從0開(kāi)始,依次累加
var currentSeason = Season.spring;
print(currentSeason.index);//0
注意:Dart中枚舉不能指定原始值,不能添加方法!!
十六、泛型
1、Dart中類(lèi)型是可選的,可使用泛型限定類(lèi)型
2、使用泛型能夠有效的減少代碼重復(fù)
類(lèi)的泛型:在類(lèi)名后定義
void main() {
var utils1 = new Utils1<int>();
utils1.put(1 );
}
class Utils1<T>{
T element;
void put(T element){
this.element = element;
}
}
方法的泛型:在方法名后定義
void main() {
var utils2 = new Utils2();
utils2.put<String>("1");
}
class Utils2{
void put<T>(T element){
print(element);
}
}