一翎碑、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ù)值之間的比較踩窖∑侣龋可用的比較運算符如下表所示。
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ù)合運算符,因為其總是一種運算符與賦值運算符的組合妄呕。
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)了抽象類,則類中必須重寫抽象類中的方法嗎两芳?