Dart-Tour2-类
类
Dart语法样式: https://www.dartlang.org/guides/language/effective-dart/style
语法:https://www.dartlang.org/guides/language/language-tour
概览
- 重要概念
- 关键词
- 注释
- 变量
- 内置类型
- 函数
- 操作符
- 流程
- 异常
- 类
- 泛型
- 库
- 异步
- 发电机
- 可调用的类
- 分离
- 类型定义
- 元数据
Dart是一种具有类和基于mixin的继承的面向对象语言。每个对象都是一个类的实例,所有类都来自Object。
基于Mixin的继承意味着虽然每个类(除了Object)只有一个超类,但是类体可以在多个类层次结构中重用。
特点:当最左边的操作数为null时,使用?.而不是.避免异常:
构造函数
1 |
class {
|
默认构造函数
如果未声明构造函数,则会为您提供默认构造函数。默认构造函数没有参数,并在超类中调用无参数构造函数。
构造函数不是继承的
子类不从其超类继承构造函数。没有声明构造函数的子类只有默认(无参数,无名称)构造函数。
命名构造函数(多构造函数)
1 |
// 命名构造函数:origin |
注意:构造函数不是继承的,这意味着超类的命名构造函数不会被子类继承。如果希望使用超类中定义的命名构造函数创建子类,则必须在子类中实现该构造函数。
一个完整的多构造函数写法:
1 |
class {
num x,y;
// 原始写法
|
调用
1 |
void classAboutMethod(){
var pointOrigin = Point(34,67);
|
结果为:
1 |
34 |
调用非默认的超类构造函数
执行顺序如下:
- 初始化列表
- 超类的无参数构造函数
- 主类的无参数构造函数
初始化列表
重定向构造函数
有时构造函数的唯一目的是重定向到同一个类中的另一个构造函数。重定向构造函数的主体是空的,构造函数调用出现在冒号(:)之后。
1 |
class {
num x,y;
Point(this.x, this.y);
Point.alongX(num x) : this(x,0);
}
|
调用:
1 |
var pointAlongX = Point.alongX(11); |
结果为:
1 |
11 |
常量构造函数
如果你想使你的类生成永远不会更改的对象,则可以使这些对象成为编译时常量。为此,请 定义 const构造函数并 确保 所有实例变量都是final。
1 |
class ImmutablePoint {
|
工厂建设者
在不需要总是创建新的实例的情况下可以使用 factory 关键字,例如下面这个例子表示:从缓存中返回对象的构造函数:
注意:工厂构造函数无权访问this。
1 |
class {
num x,y;
Point.alongX(num x) : this(x,0);
static final Map<String, Point> _cache = Map<String, Point>{};
factory Point.name(String name){
|
调用:
1 |
var pointName = Point.name('Alice');
|
结果:
1 |
477440163 |
使用class成员
- 使用
.来引用实例变量或方法
1 |
var pointOrigin = Point(34,67); |
- 当
最左边的操作数为null时,使用?.而不是.避免异常:
1 |
// 如果pointAbout不为空,那么设置x = 4; |
使用构造函数
一般情况
1 |
var pointOrigin = Point(34,67); |
注意:在Dart2中,new是可选关键字。
常量构造函数
有些类提供常量构造函数。要使用常量构造函数创建编译时常量,请将const关键字放在构造函数名称之前:
1 |
var p = const ImmutablePoint(2, 2); |
如果构造2个相同的编译时常量,那么结果是:产生同一个规范的实例:
1 |
var a = const ImmutablePoint(1, 1); |
在常量上下文中,您可以省略const构造函数或文字之前的内容。例如,查看此代码,该代码创建一个const映射:
1 |
const pointAndLine = const {
|
那么,除了第一次出现的const外其他所有的const关键字都可以省略。简写为:
1 |
// Only one const, which establishes the constant context. |
如果常量构造函数在常量上下文之外并且在没有const的情况下调用,则会创建一个非常量对象:
1 |
var a = const ImmutablePoint(1, 1); // Creates a constant |
获取对象的类型
要在运行时获取对象的类型,可以使用Object的runtimeType属性,该属性返回一个Type对象。
1 |
var pointAboutVal = Point.withVal(11, 21); |
结果为:
1 |
the type of pointAboutVal is Point |
实例变量
以下是 声明 实例变量的方法:
1 |
class {
|
所有未初始化的实例变量都具有该值null。
所有实例变量都生成一个隐式getter方法。非final实例变量也会生成隐式setter方法。有关详细信息,请参阅Getters和setter。
1 |
class Point {
|
如果初始化声明它的实例变量(而不是构造函数或方法),则在创建实例时设置该值,该实例在构造函数及其初始化列表执行之前。
方法
方法是为对象提供行为的函数。
实例方法
对象的实例方法可以访问实例变量和this。
getters and setters
抽象方法
实例、getter和setter方法可以是抽象的,定义一个接口,但将其实现留给其他类。抽象方法只能存在于抽象类中。
1 |
abstract class Doer {
|
抽象类(abstract)
使用abstract修饰符定义抽象类 - 无法实例化的类。抽象类对于定义接口非常有用,通常还有一些实现。如果希望抽象类看起来是可实例化的,请定义工厂构造函数。
1 |
abstract class Doer {
|
Dart 与 Java 关于 抽象类 的区别:
Dart:由abstract关键字修饰的类就是抽象类,由关键字决定。Java:只要一个类中有未实现的方法,这个方法就是抽象类,由方法决定。
隐式接口(interfaces)
每个类隐式的定义了一个接口,含有类的所有实例和它实现的所有接口。如果你想创建一个支持类 B 的 API 的类 A,但又不想继承类 B ,那么,类 A 应该实现类 B 的接口。
一个类实现一个或更多接口通过用 implements 子句声明,然后提供 API 接口要求。例如
1 |
// A person. The implicit interface contains greet(). |
这里是具体说明一个类实现多个接口的例子:
1 |
class Point implements Comparable, Location {
|
特点:
这里的interface接口和java不同在于:不需要定义interface,任何class都可以被implements
继承类(extends)
同Java
重写成员(@override)
同Java
注意:要在类型安全的代码中缩小 方法参数 或 实例变量 的 类型,可以使用covariant关键字。
例子:
1 |
class Animal {
|
虽然此示例显示covariant在子类型中使用,但covariant关键字可以放在超类或子类方法中。通常,超类方法是放置它的最佳位置。该covariant关键字适用于单个参数,并且在setter和字段上也受支持。
重写操作符
您可以覆盖下表中显示的运算符。

说明:表达e1 != e2是!(e1 == e2)的语法糖。
一个覆盖+和-运算符的类的示例:
1 |
class Vector{
|
结果为:
1 |
x is 2, y is 2 |
noSuchMethod()
可以通过重写noSuchMethod()可以发现或者对在代码中尝试使用不存在的方法或者实例变量作出反应。
1 |
class A {
|
你不能调用未实现的方法,除非以下一个是真实的:
接收器具有静态类型dynamic。
接收器有一个静态类型,它定义了未实现的方法(抽象是OK),接收器的动态类型的实现与类noSuchMethod() 中的实现不同Object。
枚举类型
枚举类型(通常称为枚举或枚举)是一种特殊类,用于表示固定数量的常量值。
使用enum关键字声明枚举类型:
1 |
enum Color { red, green, black }
|
枚举中的每个值都有一个index,从0开始。如:
1 |
assert(Color.black.index == 2); |
要获取枚举中所有值的列表,请使用枚举values常量。如:
1 |
List<Color> colors = Color.values; |
结果为:
1 |
当前的索引为: 0 ,对应着的值为:Color.red |
switch用法
1 |
void doSwitch() {
|
向类添加功能:mixin
mixins是一种在多个类层次结构中重用类代码的方法。可以简单的理解为: mixin修饰的类中定义了多个类中公用的变量和方法。
mix是混合的意思;in是在……里面。那么mixin可以理解为:可以混合在指定类里面的公用代码块。用mixin关键字代替class关键字来实现一个可扩展的Object类,且无需声明构造函数 :
mixin本身可以是抽象的,可以定义各种方法属性,也可以是抽象的,等后续类去实现。
mixin使用
要使用 mixin,请使用with关键字后跟一个或多个 mixin关键字修饰的类。以下示例显示了使用有mixins修饰的类:
1 |
mixin TestMixin {
|
注意:mixin 是 Dart 2.1中引入的对关键字的支持。
mixin与on关键字:
要指定只有某些类型可以使用mixin——使用on来指定所需的超类,这样你的mixin可以调用一个它自身没有定义的方法:
1 |
class BaseObject {
|
当使用on关键字后,则表示该mixin修饰的类只能在那个类的子类使用了。
多个mixin
1 |
mixin TestMixin1 on BaseContext{
var intValue = 1;
void mix1() => print('this is from textMixin1');
void printAnother() => sayHello();
}
mixin TestMixin2 on BaseContext{
|
在TestMixin1与TestMixin2中都声明了一个intValue变量,但是值不同。在class TestClass extends BaseContext with TestMixin1,TestMixin2的顺序中,得到的结果是:
1 |
2 |
即:TestMixin2 中初始化的值。
那么改变一下with的顺序呢?class TestClass extends BaseContext with TestMixin2,TestMixin1,结果是:
1 |
1 |
由此可见:取值的是最后一个with的类中的值。
类变量和方法
使用static关键字实现类范围的变量和方法。
静态变量
静态变量(类变量)对于类范围的状态和常量很有用:
1 |
class Queue {
|
注意:
- 静态变量在
使用之前不会初始化。 - 遵循
样式指南建议,优先使用lowerCamelCase作为常量名称。
静态方法
1 |
class Point {
|
注意:
- 对于常用或广泛使用的实用程序和功能,请考虑使用
顶级函数而不是静态方法。
您可以使用静态方法作为编译时常量。例如,您可以将静态方法作为参数传递给常量构造函数。
Dart-Tour2-类的更多相关文章
- Dart 面向对象 类 方法
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类. 面向对象编程(OOP)的三个基本特征是:封装.继承.多态 封装:封装是对象和类概念的主要特性. ...
- [dart学习]第七篇:类(构造函数)
前言:楼主平时基本没有使用过异常处理,所以对异常的认知可能不够准确,这里就不翻译异常的相关内容了,大家可以去官网自行阅读介绍,地址 https://dart.dev/guides/language/l ...
- Dart 语言简易教程系列
google Fuchsia系统 及 dart语言简介 在 InteIIiJ IDEA 中搭建 Dart 的开发环境 Dart Linux 开发环境搭建 Dart 语言简易教程(一) Dart 语言简 ...
- Dart编程语言入门
Dart基础入门语法介绍,详细说明可以查看相关视频<Dart编程语言入门>. 变量与常量 变量 1.使用 var 声明变量,默认值为 null var a;//null a = 10; 2 ...
- Dart和JavaScript对比小结
作为一名web前端来入门dart,新语言和我们熟悉的js有所差异,写dart的过程中容易受到原有思维的影响,这里把dart和js做一个对比总结,方便查找和熟悉. 变量声明 var 关键字 dart和j ...
- Dart 和 Flutter 使用json_annotation和json_serializable来处理json数据教程
在学习fultter的时候突然想到如何去处理从服务器获取的json或者将app中的对象数据转换成json上传给服务器 于是研究一下dart对json数据的处理 首先需要依赖下面的第三方库(这里要强调下 ...
- 【dart学习】-- Dart之类和对象
一,概述 类(Class)是面向对象程序设计,实现信息封装的基础.类是一种用户定义的类型.每个类包含数据说明和一组操作数据或传递消息的函数.类的实例称为对象. Dart的类与其它语言都有很大的区别,比 ...
- Flutter 使用json_model解析json生成dart文件
一.json_serializable使用步骤 1.集成json_serializable pubspec.yaml 添加以下依赖 dependencies: json_annotation: ^2. ...
- flutter--Dart基础语法(三)类和对象、泛型、库
一.前言 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,Flutter 开源.免费,拥有宽松的开源协议,支持移动.Web.桌面和嵌入式平台. ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
随机推荐
- windows下CreateDirectory创建路径失败的解决办法
第一: 权限不够: SECURITY_ATTRIBUTES sa;SECURITY_DESCRIPTOR sd; InitializeSecurityDescriptor(&sd,SECURI ...
- Linux-进程状态和system函数
1.进程的5种状态 (1).就绪态. 这个进程当前所有运行条件就绪,只要得到CPU时间就能直接运行. (2).运行态 就绪态时得到了CPU就进入运行态开始运行. (3).僵尸态 进程已经结束但是父进程 ...
- lnmp环境搭建:Centos7 + Nginx1.12.2 + Mysql-5.6.38 + PHP7.2.0
https://blog.csdn.net/ty_hf/article/details/50622888
- iOS头条新闻App、自动布局、省市区联动、登录按钮动画、Alert弹框效果等源码
iOS精选源码 LEEAlert -- 优雅的Alert ActionSheet 登录按钮 省市区三级联动 JHViewCorner - 一行代码搞定圆角 JHFrameLayout - 一行代码实现 ...
- 七种常见经典排序算法总结(C++实现)
排序算法是非常常见也非常基础的算法,以至于大部分情况下它们都被集成到了语言的辅助库中.排序算法虽然已经可以很方便的使用,但是理解排序算法可以帮助我们找到解题的方向. 1. 冒泡排序 (Bubble S ...
- 吴裕雄--天生自然 JAVA开发学习:多线程编程
class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( ...
- RDS的xb文件恢复到本地mysql5.6版本数据库
参考博客: https://blog.csdn.net/a18838964650/article/details/82800621 安装qpress软件 https://www.cnblogs.co ...
- python学习笔记(15)pymysql数据库操作
pymysql数据库操作 1.什么是PyMySQL 为了使python连接上数据库,你需要一个驱动,这个驱动是用于与数据库交互的库. PyMySQL : 这是一个使Python连接到MySQL的库,它 ...
- Linux系统使用IBMV3700存储(可用)
第一步:在存储上添加主机,主机采用ISCSI连接,此时需要主机的iqn 主机上获取IQN的命令如下: cat /etc/iscsi/initiatorname.iscsi 此时添加的主机状态处于脱机的 ...
- C#阶段小结
一.数据类型: (一)内建类型: 整型(int ,short, long ,byte ,uint ,ushort, ulong ,sbyte): 浮点型(double float decimal): ...