1.class关键字声明
2.使用new 创建对象,new可省略
3.所有对象都继承自Object类
属性和方法
- 属性默认生成getter和setter方法
-
final
声明的属性只有getter方法 - 属性和方法通过
.
访问 - 方法不能被重载
类及成员可见性
- Dart中的可见性以library(库)为单位
- 默认情况下,每一个Dart文件就是一个库
- 使用
_
表示库的私有性 - 使用import导入库
计算属性
- 计算属性的值通过计算而来,本身
不存储值
- 计算属性赋值,其实是通过计算转换到其他实例变量
看一个例子
class Rectangle{
num width,height;
num area(){
return width * height;
}
}
这里搞了一个方法来获得矩形面积,但对象的方法应该对应的是它自身的行为或者动作,而面积实际上更偏向于是一个属性,这个属性的值是通过长度乘以高度计算出来的,这样的话,我们就可以把面积这个属性定义成计算属性。
class Rectangle{
num width,height;
num get area{
return width * height;
}
//或者 num get area => width * height;
//计算属性也有set 我们这里传入一个值set了一下width
set area(value){
width = value / 20;
}
}
构造方法
- 如果没有自定义的构造方法就会有一个空的默认的构造方法
- 如果存在自定义的构造方法,默认构造方法无效
- 构造方法不能重载
如果想要多个构造方法,需要使用命名构造方法
命名构造方法
使用类名.方法
的形式实现:
class Person{
String name;
int age;
final String gender;
Person(this.name, this.age, this.gender);
Person.withName(this.name);
Person.withAge(this.age);
void work(){
print("wrok...");
}
}
常量构造方法
- 如果类是不可变状态(属性要么都是常量,要么都是final的只被赋值一次),就可以把对象定义成为编译时常量
- 使用const声明构造方法,并且所有变量都为final
- 使用const声明对象,可以省略
比如
void main(){
const person = const Person("zhang", 20, "Male");//后面第二个const可以省略
}
class Person{
final String name;
final int age;
final String gender;
Person(this.name, this.age, this.gender);
void work(){
print("wrok...");
}
}
工厂构造方法
- 工厂构造方法类似于设计模式中的工厂模式
- 在构造方法前加关键字
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);
}
}
初始化列表
class Person{
String name;
int age;
final String gender;
Person(this.name, this.age, this.gender);
Person.withName(this.name);
Person.withAge(this.age);
Person.withMap(Map map): name = map["name"], gender = map["gender"]{
this.age = age;
}
void work(){
print("wrok...");
}
}
静态成员
static和java一样
常量使用static const声明
对象操作符
- 条件成员的访问
?
跟Kotlin那个一样 - 类型转换
as
- 是否是指定类型
is
is!
- 级联操作
..
级联操作实际上就是个Builder模式
var person = new Person();
person..name = "zhang"
..age = 20
..work();
对象call方法,只要名称是call就可以了
- 如果类实现了
call()
方法,则该类的对象可以当作方法来使用
class Person{
String name;
int age;
void call(){
print("Name is $name, Age is $age");
}
}
void main(){
var person = new Person();
person..name = "zhang"
..age = 20;
person();
}
执行结果是call里面的print,call也可以加参数,也可以有返回值。