類和對象
- 使用
class
關(guān)鍵字聲明類
- 使用
new菊霜、構(gòu)造函數(shù)
創(chuàng)建一個(gè)對象
- 所有對象繼承自
Object
- Dart中默認(rèn)生成
setter
和getter
- 屬性和方法通過
.
訪問
-
final
修飾的屬性必須定義初始值,不能被修改
- 對象方法是不能重載的
- 屬性宁赤、方法名前面添加
_
變成私有
void main() {
LGPerson person = LGPerson();
person.name = 'flutter';
person.run();
}
class LGPerson{
final String city = '長沙';
String? name;
int? age;
void run() {
print('name:$name age:$age');
}
}
構(gòu)造函數(shù)
- 默認(rèn)構(gòu)造函數(shù)是
()
- 可以通過
this
進(jìn)行賦值
- 構(gòu)造方法中不能
return
惊畏,除非在前面添加factory
修飾構(gòu)造方法
- 使用
const
修飾構(gòu)造函數(shù)恶耽,就變成常量對象
- 當(dāng)一個(gè)對象所有成員屬性都是
final
修飾時(shí),該對象可以被創(chuàng)建為常量對象
void main() {
// LGPerson person = LGPerson();
LGPerson person = LGPerson(18,180,'flutter');
LGPerson person1 = LGPerson.whitName('oc',180);
}
class LGPerson{
String _name = 'swift';
int? age;
final height;
LGPerson(this.age, this.height,this._name);
//命名構(gòu)造函數(shù)
LGPerson.whitName(this._name,this.height);
void run() {
print('name:$name age:$age');
}
}
單例對象
class FactoryClass {
static FactoryClass? _instace;
// factory FactoryClass(){
// if(_instace == null){
// _instace = FactoryClass._init();
// }
// return _instace!;
// }
// factory FactoryClass(){
// _instace ??= FactoryClass._init();
// return _instace!;
// }
// factory FactoryClass(){
// return _instace ??= FactoryClass._init();
// }
factory FactoryClass() => _instace ??= FactoryClass._init();
//私有構(gòu)造函數(shù)
FactoryClass._init();
}
初始化列表
- 給final變量賦值颜启,在構(gòu)造函數(shù)之前訪問
- 校驗(yàn)傳遞函數(shù)的值
class Person {
String name;
int age;
final height;
Person(this.name,this.age,int h)
: height = h,
assert(h > 0),
assert(age > 0){
print('h > 0 && age > 0');
}
}
類方法
- 使用
static
修飾偷俭,不能訪問非靜態(tài)成員
void main(){
Person.age = 10;
Person.sum(20);
};
class Person {
//靜態(tài)屬性
static int age = 1;
int currentCount = 0;
//靜態(tài)方法
static int sum(int a){
return a + age;
}
//實(shí)例方法
int sum2(int a){
return a + currentCount + age;
}
}
對象操作符
-
var
修飾動態(tài)類型
-
as
強(qiáng)制轉(zhuǎn)換類型,只在使用了as
當(dāng)前有效农曲,在哪里調(diào)用社搅,哪里進(jìn)行轉(zhuǎn)換
-
is
判斷真實(shí)類型
void main(){
//動態(tài)類型
var p1 = Object();
p1 = Person();
//強(qiáng)制轉(zhuǎn)化類型
(p1 as Person).sum2(10);
if(p1 is Person){
}
}
class Person {
int currentCount = 0;
int sum2(int a){
return a + currentCount;
}
}
繼承
-
Dart
是單繼承
-
extends
關(guān)鍵字實(shí)現(xiàn)繼承
- 會繼承父類的
默認(rèn)構(gòu)造
方法
- 如果父類含有帶有參數(shù)或者帶有名字的構(gòu)造方法,必須顯性的去實(shí)現(xiàn)其中一個(gè)構(gòu)造方法
void main(){
Tearch t1 = Tearch();
t1.currentCount = 10;
t1.name = 'swift';
t1.sum2(20);
}
class Person {
int currentCount = 0;
String? name;
int sum2(int a){
return a + currentCount;
}
Person(){
print('Person -- Person');
}
Person.init();
}
class Tearch extends Person{
Tearch.init() : super.init();
int? age;
//重寫父類
@override
set name(String? _name) {
// TODO: implement name
super.name = _name;
}
}
抽象類
- 不能被實(shí)例化的類乳规,使用
abstract
修飾抽象類
- 子類繼承抽象類形葬,必須重寫抽象類的屬性和方法的實(shí)現(xiàn)
-
implements
修飾實(shí)現(xiàn)多個(gè)抽象類
- 類似OC中的協(xié)議
abstract class Person1 {
int sum1(int a);
}
abstract class Person2 {
int sum2(int a);
}
abstract class Person3 {
String? name;
}
//多實(shí)現(xiàn)抽象類
class Tearch implements Person1,Person2,Person3{
@override
int sum1(int a) {
// TODO: implement sum1
throw UnimplementedError();
}
@override
int sum2(int a) {
// TODO: implement sum2
throw UnimplementedError();
}
@override
set name(String? _name) {
// TODO: implement name
}
}
//單繼承抽象類
abstract class Person10 {
int sum10(int a);
String? age;
}
class Student extends Person10 {
@override
int sum10(int a) {
// TODO: implement sum10
throw UnimplementedError();
}
@override
set age(String? _age) {
// TODO: implement age
super.age = _age;
}
}
Mixins混入
- 實(shí)際上就是多繼承
- 混入類中不能有構(gòu)造方法
- 混入類最好不要有繼承
class Person1 {
int sum1(int a);
}
class Person2 {
int sum2(int a);
}
class Person3 {
String? name;
}
//Mixins混入
class Tearch extends Person1 with Person2,Person3{
}
重載操作符operator
void main(){
Student s1 = Student(20);
Student s2 = Student(30);
print(s1 > s2);
}
class Student {
int age;
Student(this.age);
bool operator > (Student other) => this.age > other.age;
}