定义变量
Dart定义变量的格式为:
类型 变量名 = 值;
例如:
int n = 4;
也可以不指定变量的类型,用var来定义变量:
var 变量名 = 值;
例如:
var s = "一个字符串";
如果一个变量在定义之后没有被赋过值,那么它无值(null)。
int a;
String s;
assert(a == null);
assert(s == null);
上述的a和s的值都是null,两个断言都会成立。
基本类型
Dart的基本类型有:
布尔(bool);
数(num),数又分为整数(int)和浮点数(double);
字符串(String);
列表(List)
字典(Map)
枚举(enum)
其中,List和Map都是泛型(以后介绍)。
bool只有两个值:true和false。bool和其他语言的布尔没什么太大分别,都是用于逻辑判断的。
整数不分有符号和无符号,只有int;浮点数也不像C语言中分为float和double,只有double。
字符串可以用单引号或双引号引起来。
bool b1 = true;
bool b2 = false;
int n = 35;
double x = 34.908;
num m1 = 78;
num m2 = 7.23;
String s1 = "数学分析与高等代数";
String s2 = 'Cats and Dogs';
String s3 = "如果用双引号表示字符串,那么字符串中的'单'引'号'可以不用转义符";
String s4 = '如果用单引号表示字符串,那么字符串中的"双"引"号"可以不用转义符';
列表的定义方式为:
List<T> = [t_1, t_2, ..., t_n];
其中T为列表元素的类型。例如:
List<int> A = [1, 2, 3, 4]; // 一个int列表
List<String> B = ["微分几何", "代数拓扑", "实变函数"]; // 一个String列表
字典类型的定义方式,类似于下面这样:
Map<int, String> m = {
1: "流形",
4: "偏微分方程",
};
assert(m[1] == "流形");
assert(m[4] == "偏微分方程");
枚举的用法类似于下面这样:
enum Color { Red, Black, Green }
enum Animal { Cat, Dog, Sheep }
void main() {
Color c = Color.Black;
Animal a = Animal.Cat;
if (c == Color.Black && a == Animal.Cat) {
print("黑猫");
} else {
print("不是黑猫");
}
}
传统的面向对象方式
与JavaScript不同,Dart的面向对象方式更像C#、Java那种传统的面向对象语言。Dart定义类用class关键字,例如:
void main() {
Person p = new Person(20, "华盛顿");
p.Display(); // 我叫华盛顿,今天20岁
}
class Person {
int age;
String name;
Person(int age, String name) {
this.age = age;
this.name = name;
}
void Display() {
String s = "我叫${this.name},今天${this.age}岁";
print(s);
}
}
在后面的章节中,我会详细地介绍类和对象(包括this关键字,命名构造函数,静态成员函数,继承,多态等等)。
一切都是类,一切都是对象
在Dart中所有的类型都是class,包括bool、num、int、double。
所有的类型都(直接或间接地)继承于Object。int和double都是num的直接派生类。
按照一般的面向对象语言中的“可用派生类的对象给基类类型的变量赋值”法则,我们可以写出以下代码:
int n = 5;
double a = 4.31;
num m1 = n;
num m2 = a;