运算符
/ 和 ~/
两个都表示除,但是一个返回的的是 double
类型,一个返回的是 int
类型
1 | print(5 / 2); //输出 2.5 |
is 和 is!
判断是否是某个类型
1 | print(5 is int); // 输出 true |
??=
只有在变量为 null 时才赋值
1 | // Assign value to a |
条件表达式
有两个条件表达式,一个是 condition ? expr1 : expr2
,当条件满足时,返回 expr1 的值,否则返回 expr2 的值;一个是 expr1 ?? expr2
,当 expr1 不为 null 时,返回 expr1的值,否则返回 expr2
1 | //如果 isPublic 等于 true,返回 public |
级联表达式 ..
跟链式调用比较像
1 | var list = [1, 2, 3]; |
流程控制语句
跟其他语言也差不多,这里只讲稍微有区别的地方
For
标准的 for 这里也不说了,有一个可能有些语言没有的
1 | var collection = [0, 1, 2]; |
Switch
对于符合条件的判断,如果有语句,就必须有 break
关键字,否则报错
1 | var command = 'OPEN'; |
但是如有没有语句,却不会报错
1 | var command = 'OPEN'; |
如果想同时有语句,又想继续执行,可以使用 continue
加标签的方式
1 | var command = 'CLOSED'; |
类
每一个对象都是一个类的实例,大部分语言的类都差不多,由属性和行为构成,Dart 依然有着一些独到之处
一个简单的标准类
1 | class Point { |
类中未初始化的变量值都为 null,实例化
1 | void main() { |
构造函数
声明一个构造函数,其实就是创建一个跟类同名的方法,用 this
关键字表示当前调用对象,仅当参数跟属性冲突的时候使用 this
,否则 Dart 会忽略掉 this
1 | class Point { |
Dart 的语法糖,让构造函数变简单的写法(下面的写法跟上面等效)
1 | class Point { |
默认的构造函数
如果你没有定义构造函数,会默认生成一个无参的构造函数,并调用父类的无参构造函数
构造函数不能继承
子类不会从父类继承构造函数,当没有声明构造函数时,子类将只有一个无参的构造函数
命名构造函数
使用命名构造函数来让类有多个构造函数
1 | class Point { |
调用父类中没有默认构造函数的构造函数
当父类只有命名构造函数时,由于不能继承构造函数,此时需要子类手动去调用父类的命名构造函数
1 | class Person { |
初始化变量的另一种操作
除了调用父类的构造函数来初始化外,还可以用下面的方式在构造函数体执行的时候初始化
1 | import 'dart:math'; |
注意:这种方式不能使用 this 关键字
调用别的构造函数
在同一个类中,有时候需要调用别的构造函数,使用冒号 :
1 | class Point { |
常量构造函数
使用 const
关键字来定义常量构造函数,需要确保所有变量都用 final
关键字修饰,用此类生成的对象将永不改变,应该就相当于单例吧
1 | class ImmutablePoint { |
工厂构造函数
使用 factory
关键字来修饰构造函数,实现实例化对象时,如果不需要产生新对象的情况。比如下面的例子,一个工厂构造函数,会返回缓存中存在的对象。(工厂构造函数不能访问 this
关键字)
1 | class Logger { |
函数(也可以叫方法)
实例函数
函数中可以访问变量 和 this 关键字
1 | import 'dart:math'; |
Getters and Setters
可以通过 get
和 set
来改变变量的默认取值和赋值方式,此时慎用 ++
或 --
避免意外事件
1 | class Rectangle { |
抽象类和抽象方法
面向对象基本都有抽象,直接看代码吧
1 | abstract class Doer { |
隐式接口
每个类都有一个隐式接口,该接口包含所有的实例成员和它实现的任何接口,可以通过实现此接口的方式,复写其中的 API,一个类可以实现多个接口
1 | // A person. The implicit interface contains greet(). |
继承类
使用 extends
继承父类
1 | class Television { |
复写方法
子类可以复写父类的实例方法,getters 和 setters,用 @override
注解声明
1 | class SmartTelevision extends Television { |
可复写的操作符
可以复写以下操作符,来操作两个对象
< |
+ |
` | ` | [] |
---|---|---|---|---|
> |
/ |
^ |
[]= |
|
<= |
~/ |
& |
~ |
|
>= |
* |
<< |
== |
|
– |
% |
>> |
下面是复写了 +
和 -
操作的例子
1 | class Vector { |
如果复写 ==
操作符的话,还需要复写 hashCode
的 getter ,如
1 | class Person { |
枚举
这个跟其他语言貌似也无差,定义
1 | enum Color { red, green, blue } |
使用
1 | // 通过 values |
拓展类
使用 with
关键字后面跟随一个或多个拓展类的方式,可以实现类的拓展
1 | class Musician extends Performer with Musical { |
要实现扩展类,创建一个没有构造函数,没有使用 super
关键字的类
1 | abstract class Musical { |
静态变量和静态方法
使用 static
关键字来实现类级别的变量和方法,从此脱离对象,走上人生高峰
静态变量
静态变量在未使用之前不会初始化
1 | class Queue { |
静态方法
也叫类方法,不能操作实例,不能使用 this
关键字
1 | import 'dart:math'; |
类告一段落了,以此记录,未完待续…