靜態屬性和靜態方法
在dart中,我們可以通過關鍵字
static來定義靜態屬性和靜態方法。
需要注意的是:
靜態方法不能訪問非靜態屬性【結論1】
非靜態方法可以訪問靜態成員【結論2】
我們通過下面的一段程式碼來解釋【結論1】和【結論2】
訪問靜態屬性或者呼叫靜態方法
直接通過類來訪問
複製程式碼
訪問靜態屬性和靜態方法
void main() {
// 呼叫靜態方法
PerSonInfo.showInfo();
// 訪問靜態屬性
print(PerSonInfo.name);
}
class PerSonInfo {
static String name = '張三';
int age;
static void showInfo() {
【結論1】
// 會報錯,靜態方法中,不能夠訪問非靜態屬性
// print(age);
print(name);
}
// 非靜態方法中可以訪問靜態成員【結論2】
show() {
print('姓名$name');
print('年齡$age');
}
}
複製程式碼
級聯操作符 .. 的使用
void main() {
var p = new PerSonInfo('張三', 10);
// p.name = '李四';
// p.age = 50;
// p.show();
//等價上面的程式碼
p
..name = '李四'
..age = 50
..show();
}
class PerSonInfo {
String name;
int age;
PerSonInfo(this.name, this.age);
show() {
print(this.name);
print(this.age);
}
}
複製程式碼
dart中的繼承
我們都知道dart一門物件導向的語言
那麼物件導向的語言中
有繼承、封裝、多型、這三個基本特徵
繼承:
子類使用extends關鍵字來繼承父類
子類會繼承父類中可見的屬性和方法
但是不會去繼承父類中的建構函式
子類是可以去重寫父類中的方法
複製程式碼
下面我們寫一個Grils類去繼承父類PerSonInfo
雖然Grils類中什麼都沒沒有寫
我們看一下是否可以繼承父類中的屬性和方法
複製程式碼
void main() {
var g = new Grils();
g.show();
}
class PerSonInfo {
String name='張三';
int age=10;
show() {
print(this.name);
print(this.age);
}
}
class Grils extends PerSonInfo {}
複製程式碼
繼承時需要注意的點
class PerSonInfo {
String name = '張三';
int age = 10;
PerSonInfo(this.name,this.age);
show() {
print(this.name);
print(this.age);
}
}
//Grils 會報錯
//因為子類是不能夠去繼承父類中的構造方法的
class Grils extends PerSonInfo {}
複製程式碼
遇見的問題:
如果我們不要PerSonInfo類的建構函式
那麼這個PerSonInfo類只能夠輸出一個人的資訊
如何解決了
複製程式碼
子類呼叫父類的建構函式super
void main() {
var g = new Grils('李四',30);
g.show();
}
class PerSonInfo {
String name = '張三';
int age = 10;
PerSonInfo(this.name,this.age);
show() {
print(this.name);
print(this.age);
}
}
class Grils extends PerSonInfo {
//super我們可以理解為呼叫父類中的額構造並且賦值
Grils(String name, int age) : super(name, age);
}
複製程式碼
子類可以有自己的屬性和方法
void main() {
var g = new Grils('李四', 30, '女');
g.show();
g.say();
}
class PerSonInfo {
String name = '張三';
int age = 10;
PerSonInfo(this.name, this.age);
show() {
print(this.name);
print(this.age);
}
}
class Grils extends PerSonInfo {
//子類中自己的屬性
String sex;
Grils(String name, int age, String sex) : super(name, age) {
this.sex = sex;
}
//子類中自己的方法
say() {
print('你好呀');
}
}
複製程式碼
優先呼叫子類方法的如果子類沒有在去找父類
void main() {
var g = new Grils();
g.say();//輸出 你好呀,我是子類
}
class PerSonInfo {
say() {
print('你好呀,我是父類');
}
}
class Grils extends PerSonInfo {
say() {
print('你好呀,我是子類');
}
}
複製程式碼
給命名建構函式傳遞引數
void main() {
var g = new Grils('李四', 30, '女');
g.show();
g.say();
}
class PerSonInfo {
String name = '張三';
int age = 10;
PerSonInfo(this.name, this.age);
PerSonInfo.mingFun(this.name, this.age);
show() {
print(this.name);
print(this.age);
}
say() {
print('你好呀,我是父類');
}
}
class Grils extends PerSonInfo {
String sex;
Grils(String name, int age, String sex) : super.mingFun(name, age) {
this.sex = sex;
}
say() {
print('你好呀,我是子類');
}
}
複製程式碼
複寫父類中的方法
在專案的實際開發中
父類中的方法可能不在適用了
那麼這個時候我們可以重寫父類中的方法
重寫父類中的方法可以讓程式碼變得可以擴充套件
覆寫父類中的方法,不需要新增分號
@override
複製程式碼
void main() {
var g = new Grils('李四', 30, '女');
g.say();
}
class PerSonInfo {
String name;
int age;
PerSonInfo(this.name, this.age);
say() {
print('你好呀,我是父類');
}
}
class Grils extends PerSonInfo {
String sex;
Grils(String name, int age, String sex) : super(name, age) {
this.sex = sex;
}
// 覆寫父類中的方法,不需要新增分號
@override
say() {
print('你好呀,我是子類');
}
}
複製程式碼