Dart — 面向对象的一些基本特性
dart 面向对象 移动端
使用 class 声明一个类 使用 new 创建对象 new 可省略 所有对象继承于 Object
void main(){
var person = new Person();
}
class Person{
String name;
int age;
final String gender;
void show(){
print("Name is $name,Age is $age");
}
}
属性默认生成 getter setter 方法 final 声明的属性 只有 getter 方法 方法不能重载
每个 dart 文件 理解为一个库(library) 在类名前 或者 属性 方法名前加上 _ 表示私有
Person.dart
class _Person{
String _name;
int age;
final String gender;
void _show(){
print("Name is $_name,Age is $age");
}
}
Test.dart
import 'Person.dart'
var person = _Person(); //此时会报错
计算属性
class Rectangle{
num width,height;
//使用方法获得面积
num area(){
return width * height;
}
//计算属性获得面积
num get area => width * height;
//设置计算属性的值
set area(value){
width = value / 20;
}
}
void main(){
var rect = new Rectangle();
rect.height = 20;
rect.width = 10;
print(rect.area);//200
rect.area = 200;
print(rect.width);//10
}
构造方法
有默认构造方法
class Person{
String name;
int age;
final String gender;
void show(){
print("Name is $name,Age is $age");
}
//构造方法
Person(String name,int age){
this.name = name;
this.age = age;
}
//上面写法的语法糖
Person(this.name,this.age){
print(name);
//语法糖形式 赋值在方法执行之前
//语法糖内可对final属性赋值 正常方式不行
}
//如果要使用多个构造方法 如下 类名.方法名:
Person.withName(String name){
this.name = name
}
new Person.withName("Niko");
}
常量构造方法
如果类是不可变状态 即属性都是 常量或 final,可以把对象定义为编译时常量 使用 const 声明构造方法 并且所有变量都为 final 使用 const 声明对象 可以省略
常量运行速度更快
class Person{
final String name;
final int age;
final String gender;
const Person(this.name,this.age,this.gender);
void show(){
print("Name is $name,Age is $age");
}
}
void main(){
const person = const Person("Niko",23,"Male")
}
工厂构造方法 可以有返回值 返回一个对象
缓存类可以用到
class Person{
String name;
int age;
final String gender;
factory Person(String name){
final person = Person.init(name);
return person;
}
Person._init(this.name);
}
初始化列表
void main(){
var person = new Person();
}
class Person{
String name;
int age;
final String gender;
Person(this.name,this.age,this.gender);
//在构造方法方法体之前运行 可以对final属性赋值初始化
Person.withMap(Map map): gender = map["gender"]{
this.name = map["name"];
this.age = map["age"];
}
//不是final的属性一样可以写后面
Person.withMap(Map map): name = map["name"],gender = map["gender"]{
this.age = map["age"];
}
}
静态成员 static 声明后变为 类级别 跟 java 一样 静态成员不能访问非静态 反之可以 类中的常量 用 static const 声明
class Person{
static const int max = 10;
static int age = 1;
static void init(){
age = 1;
print("init...");
}
void add(){
age++;
}
}
void main(){
Person.init();
}
对象操作符
-
?. 条件成员访问 person?.name peron?.work() a 为 null 则 b 不运行 避免空指针
-
as 类型转换 强转
-
是否指定类型 is is!
-
级联操作 ..
void main(){
var person = new Person();
person..name = "Niko"
..age = 23
..show();
}
class Person{
String name;
int age;
final String gender;
void show(){
print("Name is $name,Age is $age");
}
}
对象的 call 方法 实现了 call 方法 对象即可作为方法使用
void main(){
var person = new Person();
person("Niko",23);
}
class Person{
String name;
int age;
void call(String name,int age){
print("Name is $name,Age is $age");
}
}