类与对象
- 使用关键字class声明一个类
- 使用关键字new创建一个对象,new可以省略
- 所有对象都继承Object类
属性与方法
- 属性默认会生成setter和getter方法
- 使用final声明的属性,只有getter方法
- 属性和方法通过.来访问
- 方法不能被重载 【与java区别,后面会提到mixins多继承也与java不同】
- 使用_修饰的类,属性与方法为私有方法,作用域为当前library(库)
void main() {
var p = Person();
p.name = "Tom";
p.age = 22;
p.work(); //name is Tom,age is 22,he is worker
}
class Person {
String name;
int age;
//箭头函数以及插值表达式
work() => print("name is \$name,age is \$age,he is worker");
//报错不能重载
// work(String work){
//
// }
}
计算属性
void main() {
var rect = Rect();
rect.width = 20;
rect.height = 10;
print(rect.area); //200
rect.area=300;
print(rect.width);//15
}
class Rect {
num width, height;
//计算属性
num get area {
return width * height;
}
set area(value) {
width = value / 20;
}
//面积方法
getArea() => width * height;
}
构造方法
- 没有定义构造方法,默认会生成一个
- 存在自定义构造方法,则默认构造方法无效
- 构造方法不能重载
void main(){
var p = Person("yxjie", 28, "your heart");
var p2 =Person.withAddress("你的肺");
}
class Person{;
String name;
int age;
final String address;//只能通过语法糖方式赋值
// Person(String name,int age){
// this.name=name;
// this.age=age;
// }
//与上面等价
Person(this.name,this.age,this.address);
//定义多个构造方法
Person.withAddress(this.address);
}
常量构造方法
void main(){
var p = Person("Jerry", 16);
// p.name="hhah";//报错
}
class Person{
final String name;
final int age;
const Person(this.name,this.age);
}
工厂构造方法
class AndroidUtil{
final String name;
//工厂构造方法 特点返回一个对象实列
factory AndroidUtil(String name){
return AndroidUtil._innerConstruct(name);
}
AndroidUtil._innerConstruct(this.name);
}
初始化列表
- 初始化列表会在构造方法体执行之前执行
- 使用逗号分隔初始化表达式
- 常用语设置final变量的值
//初始化列表方式赋值
Person.withMap(map) : address = map["address"] {
this.name = map['name'];
this.age = map["age"];
}
静态成员
- 使用关键字static实现类级别的变量和函数
- 静态成员不可以访问非静态成员,非静态成员可以访问静态成员
- 类中常量需要使用 static const 修饰(java中用static final修饰)
对象操作符
- 条件运算符?.(与Kotlin一样)
- 类型转换 as (与Kotlin一样)
- 是否制定类型:is is!
- 级联操作..
void main() {
var person;
person?.work(); //不会运行
var p;
p = "";
p = Person();
(p as Person).work();
if(p is Person){
p.work();
}
//级联操作
var p1 = Person();
p1
..name = "jerry"
..age = 16;
}
class Person {
work() => print("work ...");
}
对象call方法
Dart中对象call方法类似于java中toString方法,区别在于Dart中call方法直接调用对象实列就行,java需要对象.toString()