dart基础之变量数据类型操做符方法异常

笔者也是刚刚接触dart的学习,毕竟做为一门出现比Java更晚的语言,感受相比java仍是有不少人性化的地方。如今就以和你们熟悉的java对比的角度,分享一下dart中和java不一样的地方。
java

1、变量数组

咱们知道在Java中声明变量的时候必定要给予类型,可是在dart中能够不指定类型,进而使用Object、var、dynamic来代替,下面笔者带你们一一过一下。安全

Object:其中Object表明全部对象,这个和java没什么区别,故而Object能够用来声明全部类型的变量,固然也包括int。这里须要注意的是,在dart中int也是一个类,而不是关键字了,能够在AS中点进去查看int类信息。进而咱们get到dart并非彻底按照驼峰规则来编写的,好比int是一个类,在驼峰规则中首字母本应该大写,可是却没有。闭包

var:其实在不少语言中都有var的用法,好比js、kotlin等。在dart中,var声明的变量在声明时已经决定了类型,后面不能更改,若是更改ide将会直接报错。可是若是在声明时没有赋值,而是后面赋值的话,该变量类型是能够修改的。ide


dynamic:在运行时动态修改变量类型,能够随意赋值任何类型。可是根据笔者经验,通常运行时修改的效率都会更低一些,好比反射。因此不优先使用dynamic,后面碰到有坑再说。函数

final和const修饰符:使用final和const修饰符均可以将变量修饰成不可变,区别在于final是运行时赋值,可是const是在编译时就已经赋值,因此若是将一个final变量赋值给const变量是会报错的,由于const须要在编译时给定值,可是此时final的变量并无真正赋值。反之const赋值给final则能够,const赋值给cost、final赋值给final都可以。学习

2、数据类型大数据

在java中,拥有八大数据类型,相信你们都知道,这里就不一一举例了,在dart中那八大数据类型也是支持的,只是说从java中数据类型是关键字变成了类而已,而且取消了包装类机制,和java使用起来如出一辙。值得一提的是,在dart中新增了一些数据类型,接下来一一说明。优化

num:前面说过,在dart中数据类型也是类,好比int虽然首字母小写可是它依然是一个类。num也是同样,num有2个子类,分别是int和double。须要注意的是在dart中没有float这个数据类型,只有double。总结来讲就是,若是一个数字既多是整型又多是浮点型的话,能够定义为num的对象。若是想让double转int可使用doubleValue.toInt()方法,注意若是在计算时double/double表示返回一个double,可是使用double~/double来表示返回整数。ui

String:在dart中String能够用单引号、双引号、三引号包起来,单双引号做用相似,可是能够配合起来使用,解决在双引号中包含特殊字符的问题,好比若是一个变量是a"b",若是在java中表示该字符串,须要写成"a\"b\"",可是利用单双引号配合,则能够简写成'a"b"'或者"a'b'"便可。三引号表明能够换行的字符串,能够直接在内容中间回车。

List:和java中的数组相似,也能够初始化的时候直接赋值,好比List<int> lists = [1,2,3,3],下标也是从0开始,好比修改第一个元素的值为2能够写成lists[0]=2。能够用const关键字来修饰,表明该list不可变。const List = XX和List = const XX这两种写法均可以。遍历的话和java相似,也能够用for循环和foreach循环。for(int i in lists)、lists.foreach((e)=>{print(e)})。

map:在dart中map键值对支持在初始化的时候赋值,相似于这样,map m ={ 'a': '阿里巴巴', 't': '腾讯', 'b': '百度'},获取值也是根据key来获取value,相似于var valuea = m['a']。遍历的话仍然是迭代器,和java中同样。

3、操做符

java中常见操做符在dart中依然可用,这里说一说dart新增的操做符

1.类型断定操做符

as:相似于java中的强制转换,将A类型的数据强制转换成B类型,若没法转换则抛出异常

is:判断某个对象是否属于某个类,至关于java中的instanceof关键字

is!:和is相反,若是某个对象属于某个类,则返回false

2.赋值操做符

??=:跟在一个变量后面,若是该变量值不为null则保持不变,若是为null则赋值成另外的值。举个例子,b ??= value,若是b为null则无论,不为null则将b赋值成value

3.条件表达式

expr1 ?? expr2:若是expr1不为null,则返回其值,不然返回expr2的值

4.级联操做符

..:级联操做符能够在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操做符能够避免建立临时变量, 而且写出来的代码看起来更加流畅,至关于dart系统自带build模式

5.安全操做符

?.:若是该操做符前面的变量为null则返回null不调用后面的方法或属性,能够避免空指针。好比print(a?.length),若是不用安全操做符还须要判断a是否为null,不然万一为null会报空指针

4、方法

dart中方法也有不少有趣的地方,不少都是借鉴的其余语言优势。这里就以java做为对比,列举一下dart中新特性。

特性一  方式实现可简写

当方法中只有一个表达式时,能够不使用大括号包住实现,而是使用等号箭头。注意,这里的参数类型已经省略,返回值void其实也可省略,只是不推荐这么作,省略号将变成dynamic。


特性二  一等方法对象

在dart中方法也是对象,方法的父类为Function类,这意味着方法能够赋值为变量,也意味着方法也能够做为参数传递其余方法中。


特性二  可选位置参数

把方法的参数放到[ ]中,表明参数可传可不传,传值时按照参数位置顺序传递 。以下定义了一个func方法,将i和j做为可选位置参数,最后调用时只传了1个。根据可选位置参数的特性,当参数只传了一个时,固定传给第一个参数,最后打出的结果是i为1,j为null。注意,当传的参数类型和方法第一个参数不一致时,好比讲参数1换成字符串,将直接报错。

特性三  可选命名参数

把方法的参数放到{ }中,表明参数必须经过指定形参名进行传参。以下图,经过形参:值进行传值,也能够只传其中一部分,可是必须执行给谁传值了。


特性四  默认参数值

使用[ ]或者{ }方式定义方法中的参数时,能够给定默认值。以下,在定义方法func时,咱们给定了i和j分别一个默认值,在它们没传值时默认为0。


特性五  匿名方法

dart也支持匿名方法,也能够称之为 lambda 或者 closure 闭包 ,能够做为传参用。以下例,在调用方法时将一个匿名方法传入另外一方法test中,接下来在test方法调用参数f自身。

5、异常

和 Java 不一样的是,全部的 Dart 异常是非检查异常。 方法不必定声明了他们所抛出的异常, 而且不要求你捕获任何异常。 另外,Dart 提供了 ExceptionError 类型, 以及一些子类型。你还能够定义本身的异常类型。可是, Dart 代码能够抛出任何非 null 对象为异常,不只仅是实现了 Exception 或者Error 的对象。 以下图,咱们抛出了一个整数异常,将在try...catch中的on int catch(e){}中被捕获。这是和java不同的地方,java只能抛出Exception子类。


在java中,经过catch到的Exception类型来区分Exception做相应处理。在dart中经过on 任意对象类的方式来抓住错误,该对象即为throw的对象,这里可使用rethrow将捕获的异常从新抛出。同时catch中参数e是抛出的异常对象,能够经过e.runtimeType来查看实际的类,s是错误堆栈。dart中try...catch也是有finally的,finally和Java同样在try catch执行完后执行。


总结:本次以java做为对比,介绍了一下dart中的亮点新玩法,里面确定有没有列全的,请你们多担待,由于笔者也是刚接触dart,后面有新的发现会继续学习而后给你们分享。固然有不少方面没有跟你们说到,没说到的部分就默认和java同样,你们能够本身尝试去亲身体验一把。总而言之,咱们能够发现,dart确实是一门很简洁的语言,有不少地方均可以省略,好比变量类型、方法类型、单表达式的方法体括号等等。同时,又有不少的优化,只要在判空和赋值方面,具体见上面的操做符部分。而后,还有不少的新鲜玩法,好比支持匿名方法、能够将任何类做为异常捕获对象、在java中熟知的int等基本数据类型也变成了类。我相信确定还有更多的好玩点等着咱们去学习发现,笔者后面学习到了再继续分享出来。

相关文章
相关标签/搜索