Dart 面向对象
类与对象 声明 创建 基本特性
构造方法及初始化列表
静态成员 对象操作符的使用
类与对象
关键字class声明 类
关键字new创建 对象 new可以省略
所有对象 继承于Object类
属性与方法
属性默认 生成getter和setter方法
final声明的属性只有getter方法
属性和方法通过 . 访问
方法不能被重载
void main(){//可以省略new//var person = new Person();var person = Person();//赋值和获取值person.name = "Tom";person.age = 20;print(person.name);print(person.address);person.work();}class Person{String name;int age;final String address;void work(){print("Name is $name,Age is $age,He is working...")}}
Dart 类及成员可见性
Dart 可见性以library(库)为单位
默认情况下 每个Dart文件就是一个库
_表示库的私有性(类、属性、方法)
import导入库
Dart计算属性
自定义getter和setter方法
计算属性的值是通过计算而来 本身不存储值
计算属性赋值 通过计算转换到其他实例变量
void main(){var rect = new Rectangle()rect.height = 20;rect.width =10;print(rect.area);rect.area = 200;print(rect.width);}class Rectangle{ num width,height; num get area{ return width*height; } set area(value){//高度先写死 width = value/20; }}
Dart构造方法
如没有自定义构造方法,则有默认构造方法
如果存在自定义构造方法 则默认构造方法无效
构造方法不能重载
class person{ String name; int age; final String gender;//构造方法 person(this.name,this.age,this.gender){ //是可以打印出值的,说明语法糖的赋值操作是在构造方法执行之前 //语法糖的方式可以对final属性赋值 print(name); }}
Dart命名构造方法
命名构造方法 可实现多个构造方法(弥补构造方法不能重载)
类名**.**方法的形式实现
void main(){ var person = new Person("Jim",20,"Male"); new Person.withName("Jone");}class person{ String name; int age; final String gender;//构造方法 person(this.name,this.age,this.gender);//命名构造方法 Person.withName(String name){ this.name = name; }}
Dart常量构造方法
如果类是不可变状态,可把对象定义为编译时常量
const声明构造方法,并且所有变量都为final
const声明对象 可以省略
void main(){ var person = Person("Jim",20,"Male");}class person{ final String name; final int age; final String gender; //构造方法 const person(this.name,this.age,this.gender); }
在对象所有属性只需赋值一次的情况下使用常量构造方法,常量在运行时效率也更高,因为在编译时期已经确定了
Dart工厂构造方法
工厂构造方法类似于设计模式中的工厂模式
在构造方法前添加关键字factory实现一个工厂构造方法
在工厂构造方法中可返回对象
class Logger{final String name;static final Map<String ,Logger> _cache = <String ,Logger>{};factory Logger(String name){ if(_cache.containsKey(name)){ return _cache[name]; }else{ final logger = Logger._internal(name); _cache[name] =logger; return logger;}}Logger._internal(this.name);void log(String msg){ print(msg);}}
Dart初始化列表
初始化列表会在构造方法体执行之前执行
使用逗号分隔初始化表达式
初始化列表常用于设置final变量的值
void main(){ var person = Person("Jim",20,"Male");}class person{ final String name; final int age; final String gender; ////语法糖可以给final赋值 person(this.name,this.age,this.gender); //初始化列表给final赋值 Person.withMap(Map map):gender = map["gender"]{ this.name = map["name"]; this.age = map["age"]; } //同样普通属性也可以用初始化列表方式,用逗号分隔 Person.withMap(Map map):name = map["name"],age = map["age"] gender = map["gender"]{ } }
Dart静态成员
使用static关键字来实现类及别变量和函数
静态成员不能访问非静态成员,非静态成员可以访问静态成员
类中的常量需要使用static const 声明
不能使用对象.方法访问静态方法,只能通过类名.方法名访问,与java相同
Dart对象操作符
条件成员访问:?.
void main(){Person person;//对象为空?后面逻辑就不执行了,很方便的处理了空指针的问题person?.name;person?.work();}class person{ String name; int age; void work(){ print("working..."); }}
类型转换:as
void main(){var person;person = "";person =new Person();(person as Person).work();}123456
是否制定类型:is ,is!
void main(){var person;person = "";person =new Person(); if(person is Person){ person.work(); }}
级联操作:. .
void main(){ new Person() ..name ="Tom" ..age = "20" ..work();}
赋值后返回对象然后可以继续赋值,和build模式是不是一样样的
Dart对象call方法
之前讲过方法可以作为对象来使用,在Dart中对象也可以作为方法来使用
如果类实现了 call()方法,则该类的对象可以作为方法使用
void main(){ var person = new Person(); print(person("Test",30));}class Person{ String name; int age; String call(String name,int age){ return "Name is $name,Age is $age"; }}
类声明、对象创建、属性、方法、可见性、计算属性
构造方法、命名构造方法、常量构造方法、工厂构造方法
初始化列表、静态成员、操作符、call方法
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题