flutter學(xué)習(xí)4 - dart語言學(xué)習(xí)

一翎碑、Dart中的變量

1.1、變量

var :解釋器自動推斷變量的類型之斯。注意:再次賦值的類型不一樣會報錯
dynamic:變量類型可動態(tài)改變
final:最終變量日杈,不可變的變量。在聲明時佑刷,需要對變量進行賦值
const:常量莉擒,不可變的變量。在聲明時瘫絮,需要對變量進行賦值

注意:無論什么類型的變量涨冀,如果不對其進行賦值,那么它的默認值都是 null檀何。

// 以下代碼會報錯:
var name = "變量"; 
 name = 1;

// 以下代碼不會報錯
dynamic age = 26; 
age = "26";

進行推斷

1.2 變量的數(shù)據(jù)類型

Dart 中內(nèi)置了 7 類特殊的數(shù)據(jù)類型:
numbers:數(shù)值類型
strings:字符串類型
booleans:布爾類型
lists:列表類型
maps:圖類型
runes:字符類型
symbols:符號類型

1.2.1 數(shù)值類型

在 Dart 中,數(shù)值類型有兩種廷支,分別為 int 和 double频鉴。

如果使用 0x 開頭定義數(shù)值,就表示使用十六進制數(shù)值恋拍。

如果一個數(shù)值包含小數(shù)垛孔,就需要將其定義為 double 類型。

e 符號表示科學(xué)計數(shù)法施敢。

整型數(shù)值是可以直接賦值給浮點型變量的周荐。

int a = 99; 
int b = 0xA1; 
print(a);//99 
print(b);//161

double c = 3.14; 
double d = 1.4e2; 
print(c);//3.14 
print(d);//140.0

double e = 1; 
print(e);//1.0

數(shù)值類型常用屬性

var count1 = 1; 
var count2 = 1.1; 

//runtimeType 屬性獲取運行時類型
print(count1.runtimeType);//int 
print(count2.runtimeType);//double

//獲取當(dāng)前數(shù)值是否為有限值,返回 true 或者 false 
print(count1.isFinite); 

//獲取當(dāng)前數(shù)值是否為無限值僵娃,返回 true 或者 false 
print(count1.isInfinite); 

//獲取當(dāng)前數(shù)值是否為 NaN概作,NaN 描述非數(shù)值
print(count1.isNaN); 

//獲取當(dāng)前數(shù)值是否為負數(shù) 
print(count1.isNegative); 

//獲取當(dāng)前數(shù)值的符號。若返回 1默怨,則表示為正數(shù)讯榕;若返回-1,則表示為負數(shù)匙睹;若返回 0愚屁,則表示當(dāng)前數(shù)值為 0 
print(count1.sign); 

//獲取存儲當(dāng)前數(shù)值需要的最少位數(shù),int 類型獨有的屬性
print(count1.bitLength); 

//獲取當(dāng)前數(shù)值是否為偶數(shù)痕檬,int 類型獨有的屬性
print(count1.isEven); 

//獲取當(dāng)前數(shù)值是否為奇數(shù)霎槐,int 類型獨有的屬性
print(count1.isOdd);

數(shù)值類型常用方法

var count1 = -1; 
var count2 = 1.1; 

//返回當(dāng)前數(shù)值的絕對值
print(count1.abs()); 

//返回不小于當(dāng)前數(shù)值的最小整數(shù)
print(count2.ceil());//2 

//返回不小于當(dāng)前數(shù)值的最小整數(shù),返回數(shù)值為浮點類型
print(count2.ceilToDouble());//2.0 

//返回指定范圍內(nèi)離當(dāng)前數(shù)值最近的數(shù)值梦谜,如果當(dāng)前數(shù)值在范圍內(nèi)丘跌,就直接返回
print(count1.clamp(1,10)); 

//將當(dāng)前數(shù)值與傳入的參數(shù)進行比較:如果大于傳入的參數(shù)袭景,就返回 1;如果小于傳入的參數(shù)碍岔,就返回-1浴讯;如果等于傳入的參數(shù),就返回 0 
print(count1.compareTo(0)); 

//返回不大于當(dāng)前數(shù)值的最大整數(shù)
print(count2.floor());//1 

//返回不大于當(dāng)前數(shù)值的最大整數(shù)蔼啦,返回數(shù)值為浮點類型
print(count2.floorToDouble());//1.0 

//獲取當(dāng)前數(shù)值除以參數(shù)后的余數(shù)
print(count1.remainder(5)); 

//獲取離當(dāng)前數(shù)值最近的整數(shù)榆纽,四舍五入
print(count2.round()); 

//獲取離當(dāng)前數(shù)值最近的整數(shù),四舍五入捏肢,返回浮點數(shù)
print(count2.roundToDouble()); 

//將當(dāng)前數(shù)值轉(zhuǎn)換成浮點數(shù)返回
print(count1.toDouble()); 

//將當(dāng)前數(shù)值轉(zhuǎn)換成整型數(shù)返回
print(count2.toInt()); 

//將當(dāng)前數(shù)值轉(zhuǎn)換成字符串返回
print(count1.toString()); 

//將當(dāng)前數(shù)值的小數(shù)部分丟棄后返回整數(shù)值
print(count2.truncate()); 

//將當(dāng)前數(shù)值的小數(shù)部分丟棄后返回整數(shù)值奈籽,浮點類型
print(count2.truncateToDouble());

int類型獨有的方法

var num1 = 35; 
//獲取當(dāng)前數(shù)與傳入?yún)?shù)的最大公約數(shù)
print(num1.gcd(7));//7 
//求模逆運算
print(num1.modInverse(6)); 
num1 = 2; 
//對當(dāng)前數(shù)值進行冪運算,之后進行取模運算 
print(num1.modPow(3,5));//2 的 3 次方除以 5 取余數(shù)

1.2.2 字符串類型

可以使用單引號或者雙引號來創(chuàng)建字符串

$來進行字符串的格式化

字符串也支持直接使用“+”運算符來進行拼接

即使不使用運算符鸵赫,相鄰的字符串也會自行進行拼接

使用 3 對單引號或者 3 對雙引號可以進行多行字符串的創(chuàng)建

反斜杠進行字符轉(zhuǎn)譯

var name = "變量"; 
var str3 = "Hello ${name} $name"; 
var num1 = 3; 
var num2 = 4; 
var str4 = "3+4=${num1+num2}"; 
print(str3);//Hello 變量
print(str4);//3+4=7

// “+”運算符來進行拼接
var str1 = "Hello"; 
var str2 = 'World'; 
print(str1+str2);//HelloWorld

// 相鄰的字符串自行進行拼接
print('hello''world');//helloworld

// 3 對單引號或者 3 對雙引號創(chuàng)建多行字符串
var str5 = '''第一行
第二行
第三行'''; 
var str6 = """第一行
第二行
第三行""";

print('hello \'變量\'');//hello '變量'

常用屬性和方法

//獲取字符串的字符碼集合
print(str8.codeUnits);//[97, 98, 99] 
//獲取當(dāng)前字符串是否為空字符串衣屏,返回布爾值
print("".isEmpty);//true 
//獲取當(dāng)前字符串是否為非空,返回布爾值
print("".isNotEmpty);//false 
//獲取當(dāng)前字符串長度
print(str8.length);//3 
//獲取類型
print(str8.runtimeType);//String

//通過下標(biāo)獲取某個字符串中某個字符的 code 碼辩棒,下標(biāo)從 0 開始
print("hello".codeUnitAt(0));//104 
//進行字符串比較狼忱,逐個字符進行 code 碼的比較
print("hello".compareTo('a'));//1 
//獲取當(dāng)前字符串是否包含參數(shù)字符串
print("hello".contains('l'));//true 
//判斷當(dāng)前字符串是否以某個字符串結(jié)尾
print("hello".endsWith("llo"));//true 
//判斷當(dāng)前字符串是否以某個字符串開頭
print("hello".startsWith('h'));//true 
//獲取要進行匹配的字符串在當(dāng)前字符串中的位置,如果沒找到一睁,就返回-1 
print("hello".indexOf("l"));//2 
//獲取要進行匹配的字符串在當(dāng)前字符串中的位置钻弄,逆向查找,如果沒找到者吁,就返回-1 
print("hello".lastIndexOf("l"));//3 
//在左邊進行字符串位數(shù)補齊
print("hello".padLeft(10,"*"));//*****hello 
//在右邊進行字符串位數(shù)補齊
print("hello".padRight(10,"&"));//hello&&&&& 
//進行字符串替換窘俺,將匹配到的字符串替換成指定的字符串
print("hello".replaceAll("o","p"));//hellp 
//將指定范圍內(nèi)的字符串進行替換,左閉右開區(qū)間
print("hello".replaceRange(0,3,"000"));//000lo 
//使用指定字符串作為標(biāo)記對原字符串進行分割复凳,結(jié)果會放進列表返回
print("hello".split('e'));//[h, llo] 
//進行字符串截取瘤泪,左閉右開區(qū)間
print("hello".substring(1,3));//el 
//將字符串全部轉(zhuǎn)為小寫
print("Hello".toLowerCase());//hello 
//將字符串全部轉(zhuǎn)為大寫
print("hello".toUpperCase());//HELLO 
//將字符串首尾的空格去掉
print(" hello ".trim()); 
//將字符串首部的空格去掉
print(" hello".trimLeft()); 
//將字符串尾部的空格去掉
print("hello ".trimRight());
// 對字符串進行拷貝,使用*運算符
print("hello"*2);//hellohello
// 使用中括號來獲取集合內(nèi)的某個元素
print("hello"[0]);//h

1.2.3 布爾類型

一種簡單的數(shù)據(jù)類型育八,其只有兩個字面量值:true 和 false对途。
使用 runtimeType 來獲取類型
調(diào)用 toString 方法來將布爾值轉(zhuǎn)換成字符串

bool a = true; 
bool b = false;
print(a.runtimeType);//bool

bool a = true; 
print(a.toString());//true

1.2.4 列表類型

列表用來存放一組數(shù)據(jù),也被稱為數(shù)組髓棋。在 Dart 中掀宋,列表具體的數(shù)據(jù)類型由其中的元素類型決定。
想在列表中存放不同類型的數(shù)據(jù)仲锄,則可以將列表聲明成動態(tài)類型的劲妙。
列表類型可以通過構(gòu)造方法來創(chuàng)建

下標(biāo)超出了列表元素的個數(shù),就會產(chǎn)生溢出異常儒喊。

List<int> list = [1,2,3,4];
List<dynamic> list = [1,2,3,4,"5"];

//創(chuàng)建長度為 5 的列表镣奋,默認使用 null 填充
var list2 = new List(5);//new 可以省略 [null, null, null, null, null] 
//創(chuàng)建指定長度的列表,并使用指定的值作為默認值
var list3 = List.filled(3,1);//[1,1,1] 
//通過另一個集合類型的數(shù)據(jù)來創(chuàng)建列表
var list4 = List.from(list3);//[1,1,1]

//獲取列表的第一個元素
print([1,2].first);//1 
//獲取列表中的最后一個元素
print([1,2].last);//2 
//獲取列表的長度
print([1,2].length);//2

print(["a","b","c","d"][3]);//d 
print([1,2]+[2,3]);//[1, 2, 2, 3] 
var data = [1,2,3]; 
data[2] = 4; 
print(data);//[1, 2, 4]

List 類中封裝了大量的實例方法怀愧,這些方法可以極大地提高開發(fā)者的工作效率

var l = []; 
 //向列表中增加元素
 l.add(1); 
 //向列表中增加一組元素
 l.addAll([2,3]); 
 //將列表對象映射成字典對象侨颈,下標(biāo)為鍵余赢,元素為值
 print(l.asMap());//{0: 1, 1: 2, 2: 3} 
 //將列表中某個范圍的元素進行覆蓋
 l.fillRange(0,2,"a");//[a, a, 3] 
 //獲取列表某個范圍內(nèi)的元素集合
 print(l.getRange(0,3)); 
 //獲取列表中某個元素的下標(biāo),從前向后找哈垢,如果沒有妻柒,就返回-1 
 print(l.indexOf('a')); 
 //獲取列表中某個元素的下標(biāo),從后向前找耘分,如果沒有举塔,就返回-1 
 print(l.lastIndexOf("a"));
//向列表中的指定位置插入一個元素
 l.insert(0,'s');//[s, a, a, 3] 
 //向列表的指定位置插入一組元素
 l.insertAll(0,["a","b","c"]);//[a, b, c, s, a, a, 3] 
 //刪除列表中的指定元素,從前向后找到第一個刪除
 l.remove("a"); 
 //刪除列表中指定位置的一個元素
 l.removeAt(0); 
 //刪除列表中的最后一個元素
 l.removeLast(); 
 //刪除列表中指定范圍內(nèi)的元素
 l.removeRange(0,2); 
 //將列表中指定范圍的元素進行替換求泰,替換為集合參數(shù)中的元素
 l.replaceRange(0,2,[1,2,3,4]); 
 //截取列表中范圍內(nèi)的元素返回新的列表
 print(l.sublist(0,3)); 
 //判斷列表中是否包含指定元素
 print(l.contains(2)); 
 //使用指定拼接符將列表拼接為字符串
 print(l.join("-"));//1-2-3-4 
 //將列表轉(zhuǎn)換為字符串
 print(l.toString());//[1, 2, 3, 4] 
 print(l); 
 //刪除列表中所有的元素
 l.clear();

1.2.5 字典類型

字典是一組鍵值對的集合央渣,通過鍵可以完成對值的修改、
查找渴频、添加或刪除芽丹。在 Dart 中,字典類型叫作 Map

//鍵為字符串類型卜朗、值為整數(shù)類型的字典
Map<String,int> map2 = {"1":1,"2":2};

//使用構(gòu)造方法創(chuàng)建字典
var map3 = Map(); 
//新增鍵值對
map3["name"] = "琿少"; 
print(map3["name"]);//琿少
//修改鍵值
map3["name"] = "Lucy"; 
print(map3["name"]);//Lucy 
//不存在的鍵值將返回 null 
print(map3["age"]);//null 
//將某個鍵的值置為 null拔第,并不會將此鍵值對刪除
map3["name"] = null; 
print(map3["name"]);//null

Map 對象中常用的屬性列

//判斷 Map 是否為空
print({"1":1,"2":2}.isEmpty);//false 
//判斷 Map 是否為非空
print({"1":1,"2":2}.isNotEmpty);//true 
//獲取 Map 所有的鍵
print({"name":"Lucy","age":25}.keys);//(name, age) 
//獲取 Map 所有的值
print({"name":"Lucy","age":25}.values);//(Lucy, 25) 
//獲取 Map 中鍵值對的個數(shù)
print({"name":"Lucy","age":25}.length);//2 
//獲取類型
print({"name":"Lucy"}.runtimeType);//_InternalLinkedHashMap<String, String>

Map 類中的實例方法

var map = {}; 
//向 Map 中追加鍵值對
map.addAll({"name":"Lucy","age":28});//{name: Lucy, age: 28} 
//判斷 Map 中是否包含某個鍵
print(map.containsKey("name"));//true 
//判斷 Map 中是否包含某個值
print(map.containsValue("Lucy"));//true 
//刪除某個鍵值對
map.remove("name"); 
//將 Map 轉(zhuǎn)換成字符串
print(map.toString()); 
//清空 Map 中的鍵值對
map.clear();

二、Dart中的運算符

2.1 算數(shù)運算符

算數(shù)運算符通常用來進行簡單的數(shù)據(jù)運算场钉,例如加蚊俺、減、乘惹悄、除等春叫。

print(1+2);//3 
print("1"+"2");//12
print(3-1);//2
print(-(-1));//1
print(2*4);//8
print(10/2);//5.0
// 整除
print(9~/2);//4
// 取模運算符
print(9%2);//1

// 自加和自減
var a = 3; 
a++; 
print(a);//4 
++a; 
print(a);//5

2.2 比較運算符

比較運算符的作用是進行兩個值的比較肩钠。雖然在 Dart 中泣港,比較運算符的操作數(shù)可以是任意類型的值,但是對于 List价匠、Map 或 String 對象当纱,一般會使用函數(shù)來進行比較,比較運算符更多用于數(shù)值之間的比較踩窖∑侣龋可用的比較運算符如下表所示。


image.png

2.3 類型運算符

Dart 中的類型運算符有 3 種:as洋腮、is 和 is!箫柳。

as 運算符用來進行類型的“轉(zhuǎn)換”,需要注意啥供,這里的類型轉(zhuǎn)換并不是真正意義上的轉(zhuǎn)換悯恍,其并不會真正修改數(shù)據(jù)的類型,而是告訴 Dart將當(dāng)前數(shù)據(jù)當(dāng)成某個類型的數(shù)據(jù)來進行處理伙狐。在面向?qū)ο箝_發(fā)中涮毫,這個運算符非常有用瞬欧,后面我們會介紹。

is 運算符用來判斷數(shù)據(jù)是否屬于某個類型:如果屬于罢防,就返回布爾值 true艘虎;如果不屬于,就返回布爾值 false咒吐。

is!運算符的作用則與 is 剛好相反野建,它用來判斷數(shù)據(jù)是否不屬于某個類型,示
例如下:

var a = 1; 
var b = "2"; 
print(a is int);//true 
print(b is! String);//false

2.4 復(fù)合運算符

簡單理解渤滞,復(fù)合運算符是多種簡單運算符的復(fù)合贬墩。復(fù)合運算符通常也叫作賦值復(fù)合運算符,因為其總是一種運算符與賦值運算符的組合妄呕。


image.png

2.5 邏輯運算符

邏輯運算符是針對布爾值進行運算的運算符陶舞。我們知道,布爾值只有兩種:true 和 false绪励。邏輯運算符所適用的操作數(shù)也只有 true 或者 false肿孵。

“!”被稱為邏輯非運算符,進行邏輯非運算疏魏,它是一個前置運算符停做,且只有一個操作數(shù),當(dāng)操作數(shù)為布爾值 true 時大莫,運算結(jié)果為布爾值 false蛉腌,當(dāng)操作數(shù)為布爾值 false 時,運算結(jié)果為布爾值true只厘。

“||”被稱為邏輯或運算符烙丛,進行邏輯或運算。邏輯或運算遵守下面的運算規(guī)則:
(1)當(dāng)兩個操作數(shù)中至少有一個操作數(shù)為 true 時羔味,運算結(jié)果為 true河咽。
(2)當(dāng)兩個操作數(shù)都為 false 時,運算結(jié)果才為 false赋元。

“&&”被稱為邏輯與運算符忘蟹,進行邏輯與運算。邏輯與運算遵守下面的運算規(guī)則:
(1)當(dāng)兩個操作數(shù)中至少有一個操作數(shù)為 false 時搁凸,運算結(jié)果為 false媚值。
(2)當(dāng)兩個操作數(shù)都為 true 時,運算結(jié)果為 true护糖。

print(!false);//true 
print(!true);//false

print(false||false);//false 
print(false||true);//true 
print(true||false);//true 
print(true||true);//true

print(false&&false);//false 
print(true&&false);//false 
print(false&&true);//false 
print(true&&true);//true

2.6 位運算符

位運算符是對二進制位進行操作的運算符褥芒。在計算機中,所有的數(shù)據(jù)存儲實際上采用的都是二進制椅文。

“&”用來進行按位與運算喂很。所謂按位與運算惜颇,是指將兩個運算符的每一個二進制位分別進行與運算,即若兩個對應(yīng)二進制位都為 1少辣,則運算結(jié)果為 1凌摄,否則為 0。

“|”用來進行按位或運算漓帅。與按位與運算一樣锨亏,按位或運算將兩個運算數(shù)的每個二進制位分別進行或運算,若兩個對應(yīng)二進制位有一個為 1忙干,則運算結(jié)果為 1器予,否則運算結(jié)果為 0。

“~”用來進行按位非運算捐迫。按位非運算是一個前置的單元運算符乾翔,其只有一個操作數(shù),對操作數(shù)的每一個二進制位進行取反施戴,即為 0 的位運算后結(jié)果為 1反浓,為 1 的位運算后結(jié)果為 0。

“^”用來進行按位異或運算赞哗。關(guān)于按位異或運算雷则,只需要牢記進行運算的兩個數(shù)位相同時,運算結(jié)果為 0肪笋,否則運算結(jié)果為 1 即可月劈,即兩個二進制位都為 0 或者都為 1 時,運算結(jié)果為 0藤乙,否則運算結(jié)果為 1猜揪。

“<<”用來進行按位左移運算,即將每一個二進制位向左移動指定位數(shù)湾盒。對于二進制數(shù)據(jù)湿右,
一個很重要的特點是每左移一位诅妹,會使原數(shù)值進行乘 2 操作

“>>”用來進行按位右移操作

var a = 10; //二進制 1010 
var b = 3; //二進制 0010 
print(a&b);//2 即二進制 0010

var c = 10; //二進制 1010 
var d = 4; //二進制 0100
print(c|d);//14 即二進制 1110

var e = 4; //00000100 
print(~e); //11111011 以補碼表示 原碼為 00000101 且為負數(shù) 即-5

var f = 3; // 0011 
var g = 5; // 0101 
print(f^g);// 0110 十進制 6

var h = 3;//0011 
print(h<<1);//0110 十進制 6

var i = 4;//0100 
print(i>>1);// 0010 十進制 2

2.7 條件運算符

條件運算符與流程控制語句中的條件語句作用很像.

“?:”是一個三元的運算符罚勾,其有 3 個操作數(shù),第一個操作數(shù)可以是一個布爾值或者運算結(jié)果為布爾值的表達式吭狡,
當(dāng)這個操作數(shù)為 true 時尖殃,條件運算的結(jié)果為第二個操作數(shù)的值,當(dāng)?shù)谝粋€操作數(shù)為 false 時划煮,條件
運算的結(jié)果為第三個操作數(shù)的值送丰。

“??”是 Dart 中的空條件運算符,其有兩個操作數(shù)弛秋,若第一個操作數(shù)為 null器躏,則運算后的值為第二個操作數(shù)的值俐载,若第一個操作數(shù)為非 null 值,則運算后的值為第一個操作數(shù)的值登失。這個運算符最大的作用是保證運算的結(jié)果不為 null 值遏佣,通常用來進行安全保證。

var a = 3; 
 var b = 5; 
 var res = a>b ? "a>b" : "a<=b"; 
 print(res);//a<=b

var c = null; 
print(c==null?"無作為":"額外操作 a:$c");

var c = 3; 
print(c??"無作為");

var c = null; 
c ??= 0;//與 c = c??0;意義完全一樣

2.8 級聯(lián)運算符

級聯(lián)運算符使用“..”表示揽浙,級聯(lián)運算符是 Dart 中比較高級的一種運算符状婶,它可以讓開發(fā)者對某個對象連續(xù)地進行一系列操作。這樣的好處是可以減少中間變量的生成馅巷,并且讓開發(fā)者更暢快地體驗 Dart 編碼的樂趣膛虫。

var p =People()..name="琿少"..age=26; 
print("name:${p.name},age:${p.age}");

2.9 點運算符

點運算符用來對對象的屬性和方法進行操作。

class People { 
 String name; 
 int age; 
 void printSelf(){ 
 print("name:${name},age:${age}"); 
 } 
} 

main() { 
 var p = People(); 
 p.name = "琿少"; 
 p.age = 26; 
 p.printSelf();//name:琿少,age:26 
}

補充钓猬,條件成員訪問運算符“?.”稍刀。這個運算符的作用是,如果所調(diào)用的對象是非 null 值敞曹,就會正常進行訪問掉丽,否則返
回 null,但是不會產(chǎn)生錯誤

var c = null; 
print(c?.a);//null

3 Dart 中的流程控制語句

條件語句:if-else
循環(huán)語句:while异雁,do-while捶障,for,for-in
中斷語句:break纲刀,continue
多分支條件語句:if-else if-else项炼,switch-case
異常處理:throw,try-catch-finally

補充:

while 語句會首先進行循環(huán)條件的判定示绊,如果不滿足锭部,
就不再執(zhí)行循環(huán)體,滿足條件才會進行循環(huán)面褐;

do-while 語句則是首先執(zhí)行一次循環(huán)體中的代碼拌禾,之后進行循環(huán)條件的判定,如果滿足展哭,就繼續(xù)執(zhí)行循環(huán)體湃窍,如果不滿足,就跳出循環(huán)

break 語句會直接跳出本層循環(huán)匪傍,執(zhí)行循環(huán)后面的代碼您市,而 continue 語句則是跳過本次循環(huán)后,還會進行循環(huán)條件的判定

3 Dart 高級進階

3.1構(gòu)造方法

一旦重寫了構(gòu)造方法役衡,默認的無參構(gòu)造方法將不再可用茵休。

構(gòu)造方法的實質(zhì)是將對象屬性的賦值過程由外界封裝到類的內(nèi)部。

構(gòu)造方法的編寫還有一個小技巧,一般情況下榕莺,我們可以直接將構(gòu)造方法定義成如下模樣俐芯,Dart 會自動進行參數(shù)和屬性的匹配,進行賦值钉鸯,非常方便.

main() { 
    var circle = new Circle(6,1,1);//使用參數(shù)構(gòu)造圓形對象
    print(circle.radius);//6.0 
} 
class Circle { 
    //半徑
    double radius = 0;
    //圓心 X 
    double centerX = 0; 
    //圓心 Y 
    double centerY = 0; 
    //構(gòu)造方法
    Circle(this.radius,this.centerX,this.centerY); 
}

一個類需要有多個構(gòu)造方法泼各,比如自定義的圓形類,很多時候需要快速創(chuàng)建出單位圓(圓心為坐標(biāo)原點亏拉、半徑為 1 的圓)扣蜻。這時,就可以定義一個便捷的構(gòu)造方法幫助我們直接生成單位圓及塘,這類構(gòu)造方法也被稱為命名構(gòu)造方法.

main() { 
    var circle2 = Circle.standard(); 
    print(circle2.radius);//1 
} 
class Circle { 
    //半徑
    double radius = 0; 
    //圓心 X 
    double centerX = 0; 
    //圓心 Y 
    double centerY = 0; 
    //構(gòu)造方法
    Circle(this.radius,this.centerX,this.centerY); 
    //命名構(gòu)造方法莽使,單位圓
    Circle.standard(){ 
        this.radius = 1; 
        this.centerX = 0; 
        this.centerY = 0; 
    } 
}

命名構(gòu)造方法通常用來快速地創(chuàng)建標(biāo)準(zhǔn)對象,同樣笙僚,命名構(gòu)造方法也可以有參數(shù)芳肌,并且只要參數(shù)名與類中定義的屬性名一致,也可以使用 Dart 自動匹配賦值的特性肋层。

3.2實例方法

類封裝了屬性和方法亿笤,屬性用來存儲描述類的數(shù)據(jù),方法用來描述類的行為栋猖。

方法的用法和函數(shù)一樣净薛,只是在調(diào)用時需要用對象來調(diào)用,并且方法中會自動將當(dāng)前對象綁定到 this 關(guān)鍵字上蒲拉。也就是說肃拜,在方法中可以通過 this 關(guān)鍵字獲取對象的屬性信息,也可以調(diào)用其他方法雌团。方法也需要通過點語法來進行調(diào)用燃领。

Setters 方法與 Getters 方法
Setters 方法用來設(shè)置對象屬性,Getters 方法用來獲取對象屬性锦援。其實當(dāng)我們使用點語法訪問對象屬性信息時猛蔽,調(diào)用的就是 Setters方法或 Getters 方法,在定義屬性時灵寺,Dart 會自動生成默認的 Setters 方法和 Getters 方法曼库。Setters方法和 Getters 方法的另一大作用是定義附加屬性,附加屬性也可以理解為計算屬性替久,即這些數(shù)據(jù)通常不是描述對象的最原始數(shù)據(jù)凉泄,而是通過計算得來的躏尉,例如下面的description就是附加屬性:

main() { 
    var teacher = Teacher("琿少",1101,"Dart"); 
    teacher.sayHi("小明"); //Hello 小明,我是琿少老師蚯根!編號為1101 
    teacher.teaching(); //琿少老師正在進行 Dart 教學(xué)
    print(teacher.description); //琿少:Dart 
    teacher.description = "Lucy:JavaScript"; 
    teacher.teaching(); //Lucy 老師正在進行 JavaScript 教學(xué)
} 
class Teacher { 
    String name; 
    int number; 
    String subject; 
    Teacher(this.name,this.number,this.subject); 
    void sayHi(String toName){ 
       print("Hello ${toName},我是${this.name}老師!編號為${this.number}"); 
    } 
    void teaching(){ 
       print("${this.name}老師正在進行${this.subject}教學(xué)。"); 
    } 
    String get description{ 
       return "${this.name}:${this.subject}"; 
    }
    set description(String value){ 
       this.name = (value.split(":") as List)[0]; 
       this.subject = (value.split(":") as List)[1]; 
    } 
}

上面的代碼中颅拦,description 就是附加屬性蒂誉,其并沒有真正占用內(nèi)存空間進行存儲,而是通過其他屬性計算而來的

3.3 抽象類與抽象方法

抽象類距帅,是面向?qū)ο箝_發(fā)中較為難理解的一點右锨。在 Dart 中,抽象類中可以定義抽象方法碌秸。
抽象方法绍移,是指只有定義卻沒有實現(xiàn)的方法,抽象是面向接口開發(fā)的基礎(chǔ)讥电。
抽象類實際上就是一個接口蹂窖,接口中定義了未實現(xiàn)的方法告訴調(diào)用者:如果有類實現(xiàn)了這個接口,這個類就擁有接口所描述的功能恩敌。例如瞬测,我們可以為教師類定義一個接口,示例如下:

abstract class TeacherInterface { 
    void teaching(); 
}

上面的 TeacherInterface 接口中只定義了一個抽象方法纠炮,Teacher 類可以對這個接口進行實現(xiàn)月趟,示例代碼如下:

abstract class TeacherInterface { 
    void teaching(); 
} 
class Teacher implements TeacherInterface { 
    String name; 
    int number; 
    String subject; 
    Teacher(this.name,this.number,this.subject); 
    void sayHi(String toName){ 
        print("Hello ${toName},我是${this.name}老師!編號為${this.number}"); 
    } 
    void teaching(){ 
        print("${this.name}老師正在進行${this.subject}教學(xué)恢口。"); 
    } 
}

一個類也可以同時實現(xiàn)多個接口孝宗,例如再定義一個人類接口,示例如下:

abstract class TeacherInterface {
    void teaching(); 
} 
abstract class PeopleInterface { 
    void sayHi(String name); 
} 
class Teacher implements TeacherInterface,PeopleInterface { 
    String name; 
    int number; 
    String subject; 
    Teacher(this.name,this.number,this.subject); 
    void sayHi(String toName){ 
        print("Hello ${toName},我是${this.name}老師耕肩!編號為${this.number}"); 
    } 
    void teaching(){ 
        print("${this.name}老師正在進行${this.subject}教學(xué)碳褒。"); 
    } 
}

抽象類不可以被實例化,即不能直接使用抽象類來構(gòu)造實例對象看疗,只能通過實現(xiàn)這個抽象類接口的類或者繼承它的子類來實例化對象沙峻。

遺留問題:類實現(xiàn)了抽象類,則類中必須重寫抽象類中的方法嗎两芳?

3.4 類的繼承

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摔寨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怖辆,更是在濱河造成了極大的恐慌是复,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竖螃,死亡現(xiàn)場離奇詭異淑廊,居然都是意外死亡,警方通過查閱死者的電腦和手機特咆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門季惩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來降淮,“玉大人涕蜂,你說我怎么就攤上這事。” “怎么了月弛?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵邦鲫,是天一觀的道長碘箍。 經(jīng)常有香客問我匾鸥,道長,這世上最難降的妖魔是什么蜜另? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任适室,我火速辦了婚禮,結(jié)果婚禮上举瑰,老公的妹妹穿的比我還像新娘亭病。我一直安慰自己,他們只是感情好嘶居,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布罪帖。 她就那樣靜靜地躺著,像睡著了一般邮屁。 火紅的嫁衣襯著肌膚如雪整袁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天佑吝,我揣著相機與錄音坐昙,去河邊找鬼。 笑死芋忿,一個胖子當(dāng)著我的面吹牛炸客,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戈钢,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼痹仙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殉了?” 一聲冷哼從身側(cè)響起开仰,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薪铜,沒想到半個月后众弓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡隔箍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年谓娃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒滩。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡滨达,死狀恐怖奶稠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弦悉,我是刑警寧澤窒典,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布蟆炊,位于F島的核電站稽莉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涩搓。R本人自食惡果不足惜污秆,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昧甘。 院中可真熱鬧良拼,春花似錦、人聲如沸充边。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浇冰。三九已至贬媒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肘习,已是汗流浹背际乘。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漂佩,地道東北人脖含。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像投蝉,于是被迫代替她去往敵國和親养葵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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