类
特点:
- 面向对象
- mixin继承
- 所有的类都继承自object
一、类的实例变量(成员变量)
对象的成员包括:function(成员函数)和data(成员变量)
点语法:略
.?的使用:不为null则赋值
// If p is non-null, set its y value to 4.
p?.y = 4;
实例变量(instance variable)
几个特点:
- 未初始化的实例变量的值都为null;(All uninitialized instance variables have the value null.)
- 每个成员变量都默认生成一个getter方法,非final修饰的实例变量会同时生成一个setter方法(All instance variables generate an implicit getter method. Non-final instance variables also generate an implicit settermethod. For details, see Getters and setters.
) - 在声明的时候初始化实例变量,这个值将在实例对象被创建时被赋值给实例变量,也就是说,这个过程发生在构造函数和初始化列表之前(If you initialize an instance variable where it is declared (instead of in a constructor or method), the value is set when the instance is created, which is before the constructor and its initializer list execute.)
初始化列表(initializer list )
二、构造函数
构造函数的两种形式:命名构造函数(ClassName.identifier)、默认构造函数(ClassName)
var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});
const、final、static
const:变量修饰词,含义是编译时就需要被确认类型和具体的值且只能赋值一次(类似于final的强化)
final:变量修饰词,只能赋值(初始化)一次的变量
static:变量修饰词,改变变量的生命周期和存储方式(OC中),而在dart中,只有一个意思:修饰类的成员变量,被修饰的成员变量可以被这个类使用而不能被这个类的实例使用。除此之外没有其他任何意思。
static来源:
"static" means a member is available on the class itself instead of on instances of the class. That's all it means, and it isn't used for anything else. static modifies members.
例子:

final、const对比:
- final虽然是不可变(被初始化后),但是可以再运行时被初始化,所以编译时,类型和值都可以是不确定的,而const做不到
- const和final都是修饰var(变量),只是含义不同而已
例子:
void main() {
final name = 'Bob'; // 正确
// name = 'Alice'; // 错误,final 变量只能赋值一次
// const name1; // 错误,const 变量是编译时常量,需要在声明时赋值进行初始化
// final name1; // 错误,final变量需要在声明时赋值进行初始化
const name2 = 'Alice'; // 正确
// const name3 = name; // 错误,name 是个变量,不能赋给const
final name4 = name2; // 正确,可以把const 常量赋给 final 变量
// final names1 = const[name, 3, 4]; // 错误,name 是个变量,不能赋给const
final names2 = const [name2, 'Allen', 'Brian']; // 正确
const names3 = [
'A',
'B',
'C'
]; // 正确。
const names4 = const ['A', 'B', 'C']; // 正确。
print(names3[1]);
print(names4[1]);
}
const的规范化:
对于任何给定的const值,无论const表达式被计算多少次,都将创建并重用单个const对象。
getConst() => const [1, 2];
main() {
var a = getConst();
var b = getConst();
print(a === b); // true
}
常量构造函数
特点
- 包含常量构造函数的类所有的成员变量都应该使用final;
-
有构造函数不表示该类的所有实例都是常量,换而言之,使用const修饰的构造方法具备返回常量实例的能力,但不表示一定返回常量实例。而不用const修饰的构造函数绝对不具有返回常量实例的能力(直接报错)
常量构造函数
栗子🌰:
void main() {
var a = const ImmutablePoint(1, 1); // Creates a constant
var b = ImmutablePoint(1, 1); // 不是常量,和a不相等
var c = ImmutablePoint(1, 1); // 不是常量,和a不相等且和c也不是同一个实例
var d = const ImmutablePoint(1, 1); // 常量,和a相等,hashcode一致
var e = const ImmutablePoint(1, 2); // 常量但a不相等,hashcode不一致
print(identical(a, d)); // true
print(identical(a, c)); // false
print(identical(b, c)); // false
print(identical(a, e)); // false
}
class ImmutablePoint {
static final ImmutablePoint origin = const ImmutablePoint(0, 0);
final num x, y;
const ImmutablePoint(this.x, this.y);
}
运行时情况:

网友评论