1、final变量和const变量
final 表示一个运行时常量(在程序运行的时候赋值,赋值后值不再改变)。const 表示一个编译时常量,在程序编译的时候它的值就确定了。实例变量可以是 final
类型但不能是 const
类型, 只能在以下3个对方进行初始化:
- 在变量声明时;
- 参数构造函数中(this.变量名);
- 构造函数的初始化列表中进行初始化;
2、常变量可以赋值给非常变量,反之不可以。
3、Object 和 dynamic
4、throw:Dart 可以抛出任意类型的对象
下面是关于抛出或者 引发 异常的示例:
throw FormatException('Expected at least 1 section');
也可以抛出任意的对象:
throw 'Out of llamas!';
throw 404;
5、当存在命名冲突时,使用 this
关键字。 否则,按照 Dart 风格应该省略 this
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
void show() {
print("x=" + x.toString() + ", y=" + y.toString());
}
}
对于以下面的输出,则输出x=10, y=50;
var p = Point(10, 50);
p.show();
若定义一个和类成员变量重名的局部变量后,这时候要想输出成员变量的值,则必须使用this限定符了。
6、父类构造函数的调用
若父类构造函数是无参数的构造函数(默认的或是自定义的),在子类中可以不用显式的调用父类的无参构造函数,系统会自动调用。
若父类构造函数是有参数的构造函数,则在子类中必须显示调用,且只能在参数化列表中显示调用(super(参数))。
class Point {
int x;
int y;
Point(this.x, this.y);
}
class Point3D extends Point {
int z;
Point3D(int x, int y, this.z): super(x, y); //必须在参数化列表中显示调用
}
7、成员初始化和构造函数调用顺序
int initx() {
print("父类成员变量声明时进行初始化");
return 100;
}
int initId() {
print("子类初始化列表进行初始化");
return 100;
}
int initz() {
print("子类成员变量声明时进行初始化");
return 200;
}
class Point {
int x = initx();
int y;
Point(this.y){
print("父类构造函数");
}
}
class Point3D extends Point {
int z = initz();
int id;
Point3D(int y): id = initId(), super(y){
print("子类构造函数");
}
}
void main() {
var p = Point3D(200);
}
执行顺序与输出一致: