时代背景
Dart是谷歌开发的计算机编程语言,后来被Ecma (ECMA-408)认定为标准。它被用于web、服务器、移动应用和物联网等领域的开发。它是宽松开源许可证(修改的BSD证书)下的开源软件。
Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、
具体化泛型(reified generics)、可选类型(optional typing)和sound type system.dart语言最早出现在2011年10月10至12日在丹麦奥尔胡斯举行的GOTO大会上,
刚发布时,并无多大波澜,直到2015年5月Dart开发者峰会上,亮相了基于Dart语言的移动应用程序开发框架Sky,后更名为Flutter,那时正基于移动端开发由
应用开发朝混合开发方向转变时期,flutter开始慢慢发展,在2018年2月27日在2018世界移动大会公布了flutter的Beta1版本以后,不到一年的时间,裂变到了1.0版本,
并且github几个月时间内裂变到了50kstar+的成绩,国内大厂纷纷跟进dart和flutter开发,阿里的闲鱼App在谷歌大会后不久,率先大量使用flutter改造客户端,
甚至在不久之前还开源了基于flutter的开源框架Fish Redux,而flutter的社区以及论坛,以及github每天的活跃度快速增高,sdk更新的速度也相当可观,所以可以说现在已经到了全民学习flutter的时代
Dart入坑前必须要知道的点:
在Dart中所有的类都继承于Object类,所有可以使用的变量引用的都是对象类型(即都为类的实例对象),并且数值类型、方法以及null都是对象,真正意义上的完全面向对象的语言
在开发过程中,可以忽略对象的类型,默认未指定类型的变量为dynamic(动态类型),并且可以使用静态类型修饰更明确表达开发的意图
Dart 在运行之前会先解析你的代码,你可以通过使用 类型或者编译时常量来帮助 Dart 去捕获异常以及 让代码运行的更高效
Dart 支持顶级方法 (例如
main()
),同时还支持在类中定义函数,(静态函数和实例函数)。 你还可以在方法中定义方法 (嵌套方法或者局部方法)Dart 还支持顶级变量,以及 在类中定义变量(静态变量和实例变量)。 实例变量有时候被称之为域(Fields)或者属性(Properties)
和 Java 不同的是,Dart 没有
public
、protected
、 和private
关键字。如果一个标识符以 _ 开头,则表示当前对象(库或者类)是私有的,无法被外部直接引用标识符可以以字母或者 _ 下划线开头,后面可以是 其他字符和数字的组合
Dart 工具可以指出两种问题:警告和错误。 警告只是说你的代码可能有问题, 但是并不会阻止你的代码执行。 错误可以是编译时错误也可以是运行时错误。遇到编译时错误时,代码将 无法执行;运行时错误将会在运行代码的时候导致一个异常
表达式 expression 和 语句 statement 是有区别的,不是任何时候都是一样的情况,应当注意区分情况对待
注:Dart语言在某种意义上是完全站在巨人的肩膀为时代背景,并且早期被谷歌寄予厚望,希望能借此挑战js在web端的地位,所以Dart可以说是集百家之长,
C++,Java,Kotlin,Python以及Java Sripct五大语言的优良特性于一身,但也因此失去了属于Dart这门语言的个性和风格,虽然仅仅是单线程运行的语言,
限制了Dart崛起的势头,但是因为有了这些优秀的特性支持,使得Dart依然是个值得推荐学习的面向对象语言(接下来可能会从Dart关键字,类型,异常处理,
异步支持等常见特性和java或者js进行比较学习Dart语言)
Dart中的关键字(截止至Dart 2.x版本)
Dart中的关键字非常多,可以说java,js等常见的关键字都在其中,加起来足足有56个
abstract | continue | false | new | this |
---|---|---|---|---|
as | default | final | null | throw |
assert | deferred | finally | operator | true |
async | do | for | part | try |
async* | dynamic | get | rethrow | typedef |
await | else | if | return | var |
break | enum | implements | set | void |
case | export | import | static | while |
catch | external | in | super | with |
class | extends | is | switch | yield |
const | factory | library | sync | yield |
Dart的变量类型
dart中的变量与java的变量类型有些相似但是又不完全相同,java中的变量类型大概可以归纳为四种类型(常见通用类型):
数值类型:byte、short、int、long
浮点类型:float、double
布尔类型:boolean
字符型:char、String
java中对类型划分很细节化, 区分的很明显,但是在dart中,依然可以大概分为这几类,但是dart中的容错性提高了,细节化减少,dart的基本类型大概如下:
数值类型:int、double、num
布尔类型:bool
字符型:String
可见dart中的数值类型基本就是根据是否浮点类型划分出了两个基本类型以及这两个基本类型的父类型,但是有意思的点是,int和double类型的字节大小数居然和操作系统以及当前输入的位数有关系
int
在dart中,int类型的取值范围取决于当前运行的系统环境,比如dart初衷用来运行在浏览器端,所以dart使用了javaScipct的取值范围,也就是- 2^(53) ~ 2^(53) - 1,
但是由于发展到现在dart不仅仅是用来浏览器方向开发,还兼容跨平台的app开发,所以dart又要兼容客户端的取值范围:- 2^(63) ~ 2^(63) - 1
举例:
int a = 1;
double
dart的双精度类型,取值范围完全遵循的IEEE 754标准
举例:
double a = 1;
num
在dart中除了两个通用的数值类型以外,还存在一个数值类型,即int和double的父类--num,这个类提供了转换为int和double的api方法,并且还有像abs()、
ceil()和floor()这些常见的操作方法,需要注意的是在numbers中默认的计算规则是按照取值范围比较大的double类型来计算的,即初始化的值是int但是赋值
为numbers类型的话,依然是默认按照double类型计算,所以最终需要取到int类型的值的话切记要num.toInt()方法转换为int类型的值
举例:
num a = 1.0;
print(a.toInt());
bool
在dart中有类似java/javaScripct的boolean类型的值,类型为bool,但是需要注意的是在dart中,bool的值属于编译时常量,只有true或者false两个取值
举例:
bool flag = false;
String
在dart中不再有单个字符和多个字符的区别,只有一个统一的标准--字符串类型String,这个类型与java中的String很相似,但是在dart中针对java的String新增了很多人性化的操作(尤其是字符串拼接方面),
在java中字符串拼接可能需要如下方式之一:
StringBuffer buffer = new StringBuffer();
buffer.append("aaa").append("aaa").toString();//或者使用StringBuilder创建字符串
//或者选择字符串拼接,例如:
String a = "aaa";
String b = a + "bbb";
但是可以看到java中的字符串拼接的方式很不方便,必须要+连接,在dart中选择很多,例如,两个都是String类型的字符串拼接的话,可以选择直接+连接符连接,但是遇到拼接的变量中是数值类型或者其他类型的时候,可以使用${name}的方式快速在字符串中拼接当前的变量,例如:
num abc = 1.0;
print("哈哈哈${abc}");
java中字符串拼接还可以选择StringBuffer或者StringBuilder的方式创建字符串,这两种方式在java中的区别无非就是多线程环境下是否是安全的,在dart中,也保留了这个优秀的设定,但是dart是单线程语言,所以dart中只有一个StringBuffer,可以用来写入字符串或者拼接字符串,使用如下:
StringBuffer buffer = new StringBuffer();
buffer.write("aaa");
buffer.write("bvb");
print(buffer.toString());
除此之外,我们应该知道在js中字符串可以是单引号或者双引号,但是在java中字符串必须是""包裹,只有单个字符才可以''包裹,dart由于两者的优秀特性都有,并且js和dart都只有字符串一个类型,所以在dart中单引号和双引号都可以包裹字符串类型,并且单引号包裹下的字符串还可以用特殊的方式进行数据拼接,例如:
var s1 = '字符串' '可以这样' '来连接';
可以看出来我们可以直接将需要拼接的字符串用单引号包裹,并且并排排放,就会自动进行拼接操作,除了这点以外,dart还吸收了新晋的热门语言python和kothil的特点,加入了'''特性,在java或者js开发的过程中如果我们的字符串特别长,一行放不下的话我们只能选择字符串拼接,不仅不美观,并且对于开发的便捷性也很有影响,但是dart的'''特性可以很轻松解决字符串太多换行的问题,例如:
var s = '''
这是
多行
字符串
''';
只要用'''将输入的文本包裹,中间的文本可以随便换行,是不是很方便呢?
另外在java开发中我们往往遇到了需要进行文字转义的方式,我们一般的处理方案是将\改为\\或者/来处理,但是在dart中我们可以在字符串前加入一个r标示,这样的话我们的文本就是不会被强制转义的了,例如:
var s = r'这是原始字符串,\n不会被显示为换行符。';
如上就是dart的基本类型和常用开发语言的比较,接下来的博客我们会对dart的集合,构造,异常,继承,合并继承以及可选参数的说明