(一)final和const类型html
若是你不打算修改一个变量的值,那么就把它定义为final或const类型。其中:final变量的值只能被设置一次,const变量是编译时常量(const是隐式final)。final变量在第一次使用时初始化。(注:类实例变量能够是final类型,但不能够是const类型)python
final类型的用法例子以下,在final关键字后,可选择是否显式声明变量类型:express
final name ='Bob'; final String nameS = 'Jack Ma';
经过上边的基本用法咱们能够看到:不一样于C语言的const,dart的final既能够做为变量修饰词,也能够做为变量类型使用。编程
当你试图改变一个final类型的变量值时会发生什么?咱们来试一下,对上例添加以下修改:数组
name = 'ma yun';
看,编译器提示你出错了!因此,final变量被初始化以后是不能修改其值的。post
关于const类型,官方给的说明是“编译时常量”,我目前理解也不是太深入,直接举个栗子吧:ui
var foo = const []; final bar = const []; const baz = [];
以上用法都是合法的,你还能够作以下操做,也是合法的,由于foo是var类型:编码
foo = [1,2,3];
但你不能够作下边的操做,,由于baz是const类型的:spa
baz = [2,5,9];
下边看一种const使用的特殊状况,你们本身体会体会吧:code
//如下3行代码合法 const a = 2; const b = 3; const c = a * b; //如下代码编译出错,由于a是int而不是const类型的 int a = 2; const b = 3; const c = a * b; //如下两行代码合法,由于2看成const常量类型 const b = 3; const c = 2 * b;
(二)Built-in类型
Dart语言支持如下8种内建数据类型。
(1)Numbers类型
Dart的数字类型有两种:int和double。int变量一般不超过64bit,这取决于运行平台。double是64bit双精度浮点型。
int和double都是num的子类型,num类型包括一些基本的操做,如+-*/,(位操做符,如>>,是在int类里定义的),若是num或num子类型不能知足你的需求,试试dart:math库。
关于什么是整型数、什么是浮点数就再也不举例子了啊,另外浮点数支持科学表示法。int类型可根据须要自动转换为double类型,如: double a = 1;
下边举例看看字符串和数字之间的转换,这个我以为一般挺有用的:
int i = int.parse('126'); //把字符串‘126’转化为整数126 double db = double.parse("12.36"); //把字符串'12.36‘转化为12.36 String str = i.toString(); //把整型数字126(变量i)转化为字符串’126‘ //下边一行语句把12.36转化为字符串,小数点后保留1位,自动四舍五入 String pStr = db.toStringAsFixed(1);
int类型的变量能够进行位运算操做,以下,再也不细述:
int a = 3<<1; int b = 2|3; int c = 8>>1;
(2)String类型
Dart的字符串是utf-16的序列。dart和python相似,可使用双引号,也可使用单引号建立字符串。
下面看一个例子(完整,可编译),这个栗子里边包含了两个很小、却很关键的知识点:
main() { String s1 = 'Jack Ma'; String s2 = '$s1 is ma yun'; int i1 = 123456; String s3 = 'I have ${i1.toString()} yuan'; print(s2); print(s3); if('Jack Ma is ma yun' == s2) { print('***'); } }
上述代码的运行结果是:
知识点:
一、你可使用 ${expression} 将表达式的值嵌入到一个字符串中(如上例中s3变量),若是表达式只是一个标识符,则能够直接省略{}, 如上例中的s2变量;
二、可使用 == 操做符比较两个字符串是否相同。
下面再看一个例子:
main() { String s1 = 'Jack Ma'; String s2 = ' is '; String s3 = 'Ma yun'; String s4 = s1 +s2 +s3; String s5 = 'Jack Ma'' is ''Ma yun'; print(s5); }
上例运行的结果是
Amazing!!!咱们看看s5是个什么变量,字符串,咱们再看看它是怎么赋值的?个人天呐, 把 'Jack ma'、' is '和'Ma yun'三个字符串紧挨着放在一块儿,dart就能把他们合并成一个字符串变量。你们能够打印下s4观察输出。
知识点:
一、可使用 + 操做符,将多个字符串进行拼接;
二、能够把相邻的字符串放在一块儿,编译器自动为你拼接;
三、可使用三个引号(双引号或单引号都可)建立跨行字符串(和Python相似);
四、能够经过前缀r来建立原始字符串(和Python相似,原始字符串不对转义字符进行特殊处理,如 r'hh\n' 不会将\n处理为换行)。
(3)Booleans类型
Dart使用类型bool来表示boolean值,只有两个对象是bool类型:true和false,这两个都是编译时常量。
bool类型比较简单,官网惟一的提示就是 不能使用 if(非布尔值) 或 assert(非布尔值) 这样的表达式。
(4)Lists类型
在Dart中,数组是列表对象。看下例子:
var list_a = [2,3,6];
//list_a[0] = 'string'; Error
以上程序,dart推断list_a是 List<int> ,当你试图添加一个非整型数据进去时,编译器会报错。
dart的数组像C语言同样,下标从0开始,到length-1为止,其中,能够经过list.length获取得数组的长度,以下:
main() { var list_a = const [2,3,6]; // 定义一个编译时常量list print(list_a[0]); // 打印:2 print(list_a[2]); // 打印:6 print(list_a.length); // 打印:3 }
(5)Sets类型
Dart中的set是一系列无序项的集合。看一个简单的例子:
var set_exam = {'set111', 'set222', 'set333'};
上例中,dart可以推断出set_exam是String类型的set,当你试图追加非string类型的值时,会报错。
当你想建立一个空的set时,须要在{}符号前添加set里变量的类型,或者使用set类型建立,如:
//建立一个set,其中可存放string类型的值 var names = <String>{}; 或者 Set<String> names = {}; //与上面的等价 //var names = {}; 这句话就不行了,这是建立了一个map,而不是set
向一个set中添加数据可以使用add()或addAll()方法,以下例:
var set_1 = {'111', '222', '333'}; var set_2 = <String>{}; set_2.add('Add method'); set_2.addAll(set_1);
使用 length 属性去获取一个set里的元素个数,如:
var set_1 = {'111', '222', '333'}; var set_2 = <String>{}; set_2.add('Add method'); set_2.addAll(set_1); var set_num = set_2.length; print(set_num); //打印出的值为 4
建立一个const的set,可直接在{}前添加const修饰.
(6)Maps类型
Dart的map是一种key-value键对的类型,key和value都可以是任意值。一个key只能对应一个value,可是一个value却能够有多个key。看一个map的简单例子吧:
var map_1 = {'first':'111', 'second':'222', 'third':'333'}; var map_2 = {1:'111', 2:'111', 3:'333'};
上例中,dart推断map_1是 Map<String,String> 类型,而map_2是 Map<int, String> 类型。同set同样,在类型肯定后,你不能再添加非此类型的键值对了。
也可使用Map构造一个map变量:
var gifts = Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings';
向一个map变量中添加键值对:
var gifts = {'first': 'partridge'}; gifts['fourth'] = 'calling birds'; // Add a key-value
能够直接 String st=gifts['first']; 来获取某个键对应的值,当这个键在map中不存在时,将返回null.
像set同样,map也可使用 .length 来获取其中的键值对数,再也不细述。
(7)Runes类型
Dart的rune类型主要是unicode编码之类的,我还没看太明白。。。
(8)Symbols类型
Dart的Symbol表示程序中出现的操做符或标识符,实际编程中没啥接触,再也不细述。