在前面的系列文章(文章末尾会有传送门哦~~)都是些比较简单的基础概念,之后就要开始介绍一些注重理解和手动实践的Dart知识了。这篇的内容主要是Dart中的类的构造方法。

Dart是一种面向对象的语言,具有类和基于mixin的继承。每个对象都是一个类的实例,所有的类都是Object的子类。

核心内容如下

  • 普通构造方法
  • 常量构造方法
  • 初始化列表
  • 工厂构造方法

类的成员

和java语言类似,使用点号(.)引用实例变量或方法

var p = Point(2, 2);
// Set the value of the instance variable y.
p.y = 3;

但它还可以这么写

// If p is non-null, set its y value to 4.
p?.y = 4;

这是为避免最左操作数为空时出现异常,使用 ?.代替 .

构造方法

  • 普通构造方法

如果不声明构造方法,则为您提供默认构造方法。默认构造方法没有参数,并在超类中调用无参数构造函数。

如果有多个构造方法,构造方法的写法和Java不太一样。即使构造方法的参数不同,这些构造方法的命名也不能重复

那如果有多个构造方法,我们可以通过ClassName.identifier作为它的构造方法,比如下面的Point.fromJson

class Point{var  x;var  y;Point(var x,var y){this.x=x;this.y=y;}Point.fromJson(Map<String, int> map) {x=map['x'];y=map['y'];}
}

调用构造方法

var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

当然我们这里的new关键字是可以省略的

在Dart2中new关键字为可选关键字

  • 常量构造方法


class ImmutablePoint {final num x, y;const ImmutablePoint(this.x,this.y);//常量构造方法
}

常量构造方法需要添加关键字const,并且是没有身体的,直接在末尾加;即可

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b));
print(a==b);    //true
print(b);       //Instance of 'ImmutablePoint'

构造两个相同的编译时常量会生成一个单一的、规范的实例

在常量上下文中,可以在构造函数或文字之前省略const。例如,它创建了一个const的 map集合

//这里用来很多const
const pointAndLine = const {'point': const [const ImmutablePoint(0, 0)],'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};//可以省略除第一个外的其他const
const pointAndLine = {'point': [ImmutablePoint(0, 0)],'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};
  • 初始化列表

上面的Point类我们可以这么写

Point.fromJson(Map<String, int> map):x=map['x'],y=map['y']{print('In Point.fromJson(): ($x, $y)');
}

调用超类构造方法之外,还可以在构造函数主体运行之前初始化实例变量,初始值设定项用逗号分开。

可以通过在初始化列表中使用assert来验证输入

Point.withAssert(this.x, this.y) : assert(x >= 0) {print('In Point.withAssert(): ($x, $y)');
}

这样写有什么好处呢?

初始化列表在设置final字段时很方便

我们在构造方法的body里设置final变量是不能编译通过,但通过这种方式就是ok的

import 'dart:math';class Point {final num x;final num y;final num distanceFromOrigin;Point(x, y): x = x,y = y,distanceFromOrigin = sqrt(x * x + y * y);
}main() {var p = new Point(2, 3);print(p.distanceFromOrigin);
}///运行结果
3.605551275463989
  • 工厂构造方法

工厂构造方法可以从缓存返回实例,也可以返回子类型的实例
在实现构造方法时使用factory关键字,工厂构造方法并不总是创建类的新实例。

class Logger {final String name;bool mute = false;//用于缓存已经实例化的对象static final Map<String, Logger> _cache =<String, Logger>{};factory Logger(String name) {if (_cache.containsKey(name)) { //如果map缓存里存在直接返回实例return _cache[name];} else {   //如果map缓存里不存在,则返回新的实例final logger =  Logger._test(String name):this.name=name;;_cache[name] = logger;return logger;}}//???Logger._internal(this.name);void log(String msg) {if (!mute) print(msg);}
}

上面代码还是比较好理解的,不知道在我标记问号的那句代码你有没有懵逼?反正我看的时候是感觉有点奇怪的。

其实仔细一研究,它其实等价于这样的写法

Logger._internal(String name):this.name=name;

Dart相关系列的传送门

  • 带你Dart带你Diao之重要概念
  • 带你Dart带你Diao之Functions
  • 带你Dart带你Diao之操作符
  • 带你Dart带你Diao之流程控制语句和异常

带你Dart带你Diao之类(一)相关推荐

  1. 解释三度带和六度带的概念以及各坐标系如何定义

    ★ 地形图坐标系:我国的地形图采用高斯-克吕格平面直角坐标系.在该坐标系中,横轴:赤道,用Y表示:纵轴:中央经线,用X表示:坐标原点:中央经线与赤道的交点,用O表示.赤道以南为负,以北为正:中央经线以 ...

  2. 张朝阳直播带货首秀 带的不仅是好物而是价值平台

    6月8日晚7点,搜狐公司董事局主席兼CEO.搜狐视频CEO张朝阳在搜狐视频APP关注流中开启个人直播带货首秀. 此次直播带货以<Charles的好物分享>为主题,模式与众不同,此次张朝阳带 ...

  3. 什么是带内管理 带外管理?(转)

    什么叫带外管理? 常见的设备管理方式有SNMP.RMON.Web.TELNET以及通过CONSOLE.AUX接口管理,有些高端设备还具备100BASE-TX的带外管理端口. 我在网上查到大概SNMP. ...

  4. linux 构造函数 throw,在自定义异常的方法/构造函数签名中带和不带throw()的C++...

    我是C++的初学者,因此对这个愚蠢的问题表示歉意.我在这里发布它,因为我无法在stackoverflow上找到类似的答案.在自定义异常的方法/构造函数签名中带和不带throw()的C++ 我是通过在C ...

  5. console线驱动安装_低压灯带和高压灯带区别是啥 安装方法是啥?

    灯带是很多朋友都知道的,而且一般都是在客厅比较常见,灯带分为低压和高压两个,这两者也是有一定区别的,很多人也在纠结购买哪种灯带比较好,下面就跟装一网一起来看看低压灯带和高压灯带区别以及安装方法,希望大 ...

  6. Python带*参数和带**参数:可变参数

    一.理论解释: *参数与**参数是Python参数中的重点知识,他们都被称为可变参数(任意参数),我们经常会在代码中看到*args.**kwargs 作为函数定义时:收集未匹配参数组成tuple或di ...

  7. 利用栈实现四则运算,带负数,带括号,带小数

    这利用栈实现四则运算,带负数,带括号,带小数,自己写的有问题大家纠正. #include <stdio.h> #include <stdlib.h> #include < ...

  8. import 带{} 和不带的区别

    import 带{} 和不带的区别https://blog.csdn.net/ALakers/article/details/108568999

  9. [Matlab]椭圆滤波器设计:低通、高通、带通和带阻(4)

    [Matlab]椭圆滤波器设计:低通.高通.带通和带阻-------(4) ​ 椭圆滤波器(Elliptic filter)又称考尔滤波器(Cauer filter),是在通带和阻带等波纹的一种滤波器 ...

  10. Python实现猜词游戏 Hangman Game(不带提示和带提示版本)

    本文目录 Python实现猜词游戏(Hangman Game) 一.任务准备 二.Hangman游戏的功能需求 三.辅助函数的构建 1.确定一个单词是否被猜出 2.获取用户当前的猜词进度 3.确定还有 ...

最新文章

  1. html底部沉底显示,Footer部分永远沉底。
  2. python中对多态和多态性的理解
  3. 抢攻5G网络功能虚拟化,英特尔推专用FPGA加速卡
  4. MobX - 基于响应式的状态管理
  5. PyCairo 中的透明度
  6. 学习jvm,关于MAT an internal error occurred during:Parsing heap dump from问题
  7. 测试必备:if条件测试( if-else语句、if-elif-else语句、多个elif代码块、省略else代码块、测试多个条件)
  8. 数组实例的entries(),keys() 和 values()方法
  9. LuoguP2764 最小路径覆盖问题(最大流)
  10. 智能医疗信息管理系统源码 医疗信息管理
  11. build-up to Ajax v,to build up是什么意思
  12. python远程监控_Python实现远程端口监控实例
  13. python推箱子游戏顶层设计子层设计_python实现推箱子游戏
  14. 08 | 数据采集:如何自动化采集数据?
  15. 理解-1NF,2NF,3NF
  16. 中国钢丝绳行业竞争现状及需求前景预测报告(新版)2022-2027年
  17. linux_ rpm管理(Synaptic Package Manager)
  18. AC 瘦AP配置 ensp
  19. jsp未正确拼写字 mysql_MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结...
  20. 网赚灰产不归人——雅贼归来(上)

热门文章

  1. UltraCompare比较文件时出现UTF8_ConvertorForMac无转换符号!
  2. SLA是什么意思 ?
  3. 虚拟网卡服务器端软件,不再挤房间!自己动手架设自己的“浩方”对战平台
  4. 华为HG8347R V3R016C10S135光猫桥接 北京联通 恢复华为原版
  5. Azure云centos7安装图形化界面
  6. 51单片机Proteus仿真+Keil工程-实验5-单片机串行口中断实验
  7. linux工作区切换到桌面,linux切换桌面环境 gnome kde
  8. 路由器、DDNS、花生壳
  9. NEWSCTF第一届--官方wp(2021新春赛)
  10. Kali linux安装拼音、双拼、五笔拼音输入法:fcitx-table-wbpy中文输入法步骤详解