Dart语言入门基础(二)

类和对象

类的定义

Dart语言入门基础(二)_第1张图片

Dart中的类与Java中的相似,不同的是,Dart中没有privatepublic这些成员访问修饰符。如果是类私有的成员,不希望外面访问,只需要在成员变量之前加上一个下划线_变为私有即可。

以上代码,在Dart中还有一种简化写法,可以自动在构造方法中对成员变量初始化。

Dart语言入门基础(二)_第2张图片

另外还需要注意一点,Dart中没有构造方法的重载,不能写两个同名的构造方法。

Getters 和 Setters方法
在Java中,一般不会直接在类的外部去访问类成员,通常使用setter和getter方法来操作类的成员变量。而在Dart语言中,所有类中都包含隐式的getter方法,对于非final修饰的成员,类中还包含隐式的setter方法。这就意味着,在Dart中,你可以直接在类外部通过.操作符访问类成员。这一特点使得Dart语法更加简洁,不会写出满屏的setXXX、getXXX方法。

当然,很多时候我们调用setter和getter方法并不仅仅是为了赋值和访问,而是为了一些额外的处理,这时候我们只需要使用set与get关键字实现setter和getter方法即可。

Dart语言入门基础(二)_第3张图片

 要注意,在创建对象时,new关键字并不是必须的,可以省略不写。在写Flutter界面时,不建议写new关键字实例化对象,因为Flutter框架中没有类似的xml语言来描述UI界面,界面也是使用Dart语言来写,在使用Dart写UI时,要保持代码的简洁和结构化,省略new会更友好。

构造方法

如果没有定义构造方法,则会有一个默认的无参构造方法,并且会调用超类的无参构造方法。

命名构造方法

上面已经说过,Dart类中两个同名构造方法不能重载,但是Dart语言为类新增了一种称为命名构造方法的东西。

Dart语言入门基础(二)_第4张图片

 注意,使用命名构造方法可以为一个类实现多个构造方法,也可以更清晰的表明意图。

常量构造方法

如果想提供一个状态永远不变的对像,在Dart中,我们可以创建一个编译时常量对象,节省开销。

Dart语言入门基础(二)_第5张图片

工厂构造方法

当我们需要创建一个新的对象或者从缓存中取一个对象时,工厂构造方法就派上了用场。

Dart语言入门基础(二)_第6张图片

构造方法重定向

有时候一个构造方法会调动类中的其他构造方法来实例化,这时候可以使用构造方法重定向

Dart语言入门基础(二)_第7张图片

类的初始化列表

熟悉C++的朋友应该对初始化列表很了解了,Java中是没有这个特性的。

Dart语言入门基础(二)_第8张图片

 

初始化列表位于构造方法的小括号与大括号之间,在初始化列表之前需添加一个冒号。
初始化列表是由逗号分隔的一些赋值语句组成。
它适合用来初始化 final修饰的变量
初始化列表的调用是在构造方法之前,也就是在类完成实例化之前,因此初始化列表中是不能访问 this的


运算符重载
这个特性,又很类似于C++中的运算符重载,在Java中是没用这种概念的。

Dart语言入门基础(二)_第9张图片

Dart中允许重载的运算符如下:

+ * ~/ / % ^
< > <= >= == [] []=
& ~ << >> |

类的继承

Dart中的继承,与Java中相似,可以使用关键字extends继承父类,使用关键字super引用父类

Dart语言入门基础(二)_第10张图片

 我们知道,Java中的类仅支持单继承,而Dart中的类也只支持单继承。但是Dart可以使用一种被称为混入的方式来达到多继承的效果,这需要使用with关键字。

Dart语言入门基础(二)_第11张图片

打印结果

要注意,以上继承写法中,也可以直接使用with,等价于如下写法

 接口抽象

抽象类

Dart语言没有提供interface关键字来定义接口,但是Dart语言中保留了抽象类,同Java,使用abstract关键字来修饰抽象类。而Dart中的抽象类,实际上就相当于Java中的接口。

 注意,抽象类是不能被实例化的,子类继承抽象类时,必须实现全部抽象方法

隐式接口

实际上在Dart中,每个类都隐式的定义了一个包含所有实例成员的接口, 并且该类实现了这个接口。

因此,如果我们想实现某个接口,但有又不想继承,则可以使用这种隐式接口机制。我们需要用到关键字implements


泛型 

 Dart中也支持泛型,用法与Java中类似

Dart语言入门基础(二)_第12张图片

异常处理

如果关心具体异常,针对不同异常进行不同处理,可以使用try...on处理异常,finally是可选的,用于最后的处理。

Dart语言入门基础(二)_第13张图片

不关心具体异常,只想捕获,避免异常继续传递,则可以使用try...catch处理


如果想获取更多异常信息,可以使用两个参数的catch,第二个参数是异常的调用栈信息  

如果你既想针对不同异常进行不同处理,还想打印调用栈信息,那就将两种结合起来使用


库与导入 

Dart使用import语句用来导入一个库,后面跟一个字符串形式的Uri来指定表示要引用的库。

Dart语言入门基础(二)_第14张图片

 导入库时,可以使用as关键字来给库起别名,避免命名空间冲突

Dart语言入门基础(二)_第15张图片

使用showhide关键字控制库中成员的可见性


为了减少 APP 的启动时间,加载很少使用的功能,我们还可以延迟导入库。使用 deferred as关键字延迟导入

异步编程
Dart与JavaScript一样,是一个单线程模型。但这并不意味着Dart中不能进行异步编程,只是这种异步编程区别于传统的多线程异步方式。

Dart中的所有代码都只在一个线程上运行,但Dart代码可以运行在多个isolate上。isolate可以看做一个微小的线程,isolate由虚拟机调度,isolate之间没有共享内存,因此它们之间没有竞争,不需要锁,不用担心死锁,因此开销小,性能高。由于没有共享内存,所以它们之间唯一的通信只能通过Port进行,而且Dart中的消息传递也总是异步的。

Dart中两种方式可以使用Future对象来进行异步编程

使用 async 和 await关键字
使用 Future API
使用async和await编写代码非常简单,而且编写的代码看起来有点像同步代码,实际上是异步的。
Dart语言入门基础(二)_第16张图片

运行结果:

在函数签名中加入async关键字,表示该函数异步执行,await表示等待异步结果执行完成返回Future对象。但有一点需要注意,await只能在async函数中出现,因此往往需要再定义一个async函数,用于包装。上述代码中test函数就是用于包装。 


你可能感兴趣的:(android,flutter,android,studio)