函數
- 命名可選參數
{}
void user(String name,{int age, String sex}){
print('$name, $age, $sex');
}
void main(){
user('張三'); //張三, null, null
user('張三', age:12); //張三, 12, null
}
- 位置可選參數
[]
void user(String name,[int age, String sex]){
print('$name, $age, $sex');
}
void main(){
user('張三'); //張三, null, null
user('張三', 12); //張三, 12, null
}
- 作用域
Dart函數閉包
- js函數閉包:函數嵌套;子函數可以使用父函數的變量;函數里的變量不會被垃圾回收機制回收。
- 定義的test函數里返回另一個函數
main(List<String> args){
var t = test(10); // t是test里面返回的匿名函數
print(t(5));
}
test(int a){
return (int b){
return a+b;
};
}
類的定義
- Dart是一個面向對象編程語言,定義類用class關鍵字,類通常由兩部分:成員、方法
main(List<String> args){
var p = new Person();
Person p1 = new Person();
print(p.name); // 成員屬性,通過實例化后的對象去訪問
}
// 定義類用關鍵字class
class Person{
// 定義屬性
String name = 'll';
int age = 18;
// 定義方法
void getInfo(){
print('$name: $age'); // 同方法中沒有同變量名的話,指向成員方法的變量名
// ptint('${this.name}:${this.age}')
}
}
構造函數
- 默認構造函數名字和類名一樣
main(List<String> args){
var p = new Person('ll', 18);
print(p.name);
print(p.age);
}
class Person{
String name;
int age;
Person(String name, [int age]){
this.name = name;
this.age = age;
}
}
- 命名構造函數
main(List<String> args){
var p = new Person('ll', 18);
print(p.name);
}
class Person{
String name;
int age;
// Persin(String name, [int age]){
// this.name = name;
// this.age = age;
// }
// 注釋寫法可以簡寫為以下的語法糖
Person(this.name, this.age);
}
- 抽離類文件
import 'XXX.dart'
main(List<String> args){
var p = new Person();
// p._getName(); // 不能直接調用私有方法, 可以通過公有方法調用私有方法
p.getName();
}
// 抽離整個類到XXX.dart
// class Person{
_name = '私有變量';
_getName() { // 私有方法
print(_name);
};
getName(){
this._getName();
}
// }
- 私有屬性的使用
- Dart中沒有
public/private/protected等訪問修飾符
- 可以用
_單獨標記為私有屬性,必須抽離到單獨的文件
- 私有屬性無法通過實例化后直接使用(
p._name報錯)
- 可以通過公有的方法訪問到私有屬性
- 初始化列表
- 在執(zhí)行構造函數體內容前,先執(zhí)行初始化列表的內容
main(List<String> args){
var p2 = new Person.test('pp', 99);
p2.getInfo();
}
class Person{
String name;
int age;
Person.test(String name, int age) : this.name = name, this.age = age;
getInfo(){
print('$name--$age');
}
}
- 靜態(tài)屬性和方法
main(){
print(Person.des); // 訪問靜態(tài)屬性
print(Person.test()); // 訪問靜態(tài)方法
}
class Person{
String name = 'll';
int age = 20;
static String des = '我是靜態(tài)屬性';
static test() {
print('我是靜態(tài)方法');
}
}
對象的操作符
-
is/?/..
main(List<String> args){
Person p;
p?.name;
Person p1 = new Person('ll', age:18);
print(p1.name);
// is
print(p1 is Person);
// ..
p1.name = 'pp';
p1.age = 21;
p1..name = '..'
..age = 22;
}
class Person{
String name;
int age;
Person(this.name, {this.age});
}
繼承super關鍵字
main(){
var m =new Male('replace', 20);
// 可以調用成員屬性和方法
print('${m.name}');
m.getInfo();
}
class Person{
String name='ll';
int age = 10;
// 1-->
// Person(this.name, this.age);
getInfo(){
print('$name--$age, 父類方法');
}
}
class Male extends Person{
// 在調用父類上的構造函數上,覆蓋了成員屬性的值
String name;
int age;
Male(this.name, this.age);
// -->1
// Male(this.name, this.age): super(name, age);
// 2. 繼承(重寫)父類方法
getInfo(){
super.getInfo();// 調用的就是父類的info方法
print('姓名 $name:年齡: $age;');
}
}
抽象類
- 定義:Dart中的抽象類, 用于定義標準,子類可以繼承抽象類, 也可以用抽象類實現接口:
- Dart中抽象類沒有方法體的方法我們稱為抽象類
- 如果子類繼承抽象類必須得實現里面的抽象類方法
- 如果把抽象類作為接口實現的話必須得實現抽象類里面定義的所有屬性和方法
- 抽象類不能實例化,只能繼承它的子類
- extends抽象類和implements抽象類的區(qū)別:
- 如果要復用抽象類里面的方法,并且要用抽象方法約束的話我們用extends繼承抽象類
- 如果只是把抽象類當作標準的話我們就用implements實現抽象類
main(){
var m = new Male();
m.dance();
}
// 定義抽象類
abstract class Person{
// 定義抽象方法
sing();
dance();
getInfo(){
print('我是普通方法');
}
}
// 繼承抽象類: 子類一定要實現父類(抽象類)的抽象方法
class Male extends Person{
@override
dance(){
print('ll在跳舞');
}
@override
sing(){
print('ll在唱歌');
}
}
// 多態(tài):Dart中多態(tài)是父類定義一個方法不去實現,讓繼承它的子類去實現,每個子類有不同的表現
class Famale extends Person{
@override
dance(){
print('ll2在跳舞');
}
@override
sing(){
print('ll2在唱歌');
}
}