Flutter学习之Dart语言基础(构造函数)
最常见的构造函数形式,即生成构造函数,创建一个类的新实例:
class Point {
  num x, y; //Dart中int和double是num的子类
  //this引用当前类对象
  Point(num x, num y) {
    this.x = x;
    this.y = y;
  }
}
使用语法糖的时候可以这样定义:
class Point {
  num x, y;
  //用于设置x和y的语法糖
  //在构造函数体运行之前
  Point(this.x, this.y);
  @override
  String toString() {
    return ("x: $x, y: $y");
  }
}
//print(new Point(100, 200)); -> 打印 x: 100, y: 200
默认构造函数
如果未声明构造函数,则会提供默认构造函数。 默认构造函数没有参数,并在调用父类无参数构造函数。
class Parent{
  Parent(){
    print('In Parent\'s constructor.');
  }
}
class Child extends Parent{
  Child(){
    print('In Child\'s constructor.');
  }
}
//new Child(); -> 打印 In Parent's constructor.  In Child's constructor.
构造函数不能继承
子类不能继承其父类构造函数,一个没有声明构造函数的子类只有默认(无参数,无名称)构造函数
命名构造函数
当我们需要定义一个有特别含义的构造函数的时候,可以通过构造函数.XXX来命名构造函数
class Point{
  num x;
  num y;
  Point(this.x, this.y);
  //创建一个坐标原点类
  Point.origin(){
    this.x = ;
    this.y = ;
  }
 //创建一个坐标为(100, 100)的类
 Point.coordinate100(){
    this.x = ;
    this.y = ;
  }
  @override
  String toString() {
    return ("x: $x, y: $y");
  }
}
调用父类构造函数
默认情况下,子类中的构造函数调用父类的未命名无参数构造函数。 父类的构造函数在子类构造函数体的开头被调用。 如果还使用初始化了列表,则会在调用父类构造函数之前执行。 执行顺序如下:
    初始化列表
    父类的无参数构造函数
    子类的无参数构造函数
如果父类没有未命名的无参数构造函数,则必须手动调用父类中的一个构造函数。 在子类的构造函数体之后用冒号(:)指定父类构造函数
例1:默认先调用父类的无参数构造函数
class Parent{
  Parent(){
    print('In Parent\'s constructor.');
  }
}
class Child extends Parent{
  Child(num x, num y) {
    print('In Child\'s constructor.');
  }
}
//new Child(100, 100); -> 打印
//In Parent's constructor.
//In Child's constructor.
例2:手动调用父类其他构造函数
class Parent{
  num x;
  num y;
  Parent(this.x, this.y){
    print('In Parent\'s constructor.');
  }
}
class Child extends Parent{
  Child(num x, num y) : super(x, y){
    print('In Child\'s constructor.');
  }
}
//new Child(100, 100); -> 打印
//In Parent's constructor.
//In Child's constructor.
关于初始化列表:
调用父类构造函数之前,可以在构造函数体执行之前初始化示例变量,用逗号分隔,该过程叫初始化列表。
class Parent{
  num x;
  num y;
  num sum;
  Parent(num px, num py) : x = px, y = py, sum = px + py{
    print("x: $x, y: $y, sum: $sum");
    print('In Parent\'s constructor.');
  }
}
class Child extends Parent{
  Child(num x, num y) : super(x, y){
    print('In Child\'s constructor.');
  }
}
// new Child(100, 100); -> 打印
//x: 100, y: 100, sum: 200
//In Parent's constructor.
//In Child's constructor.
重定向构造函数
有时构造函数需要重定向到同一个类中的另一个构造函数,在冒号后面用this:
class Point {
  num x, y;
  //类的主构造函数
  Point(this.x, this.y);
  //重定向到主构造函数
  Point.alongXAxis(num x) : this(x, );
}
常量构造函数
如果你的类需要成为永远不会更改的对象,则可以使这些对象成为编译时常量。 定义const构造函数要确保所有实例变量都是final。
class Point {
  final num x;
  final num y;
  static final Point2 origin = const Point2(, );
  //const关键字放在构造函数名称之前,且不能有函数体
  const Point2(this.x, this.y);
}
没有定义final时提示:
const-construcot.png
使用函数体时提示:
const-construcot.png
工厂构造函数
在实现不用总是创建新的类对象的时候,可以使用factory关键字。 例如,工厂构造函数可能从缓存中返回实例,或者它可能返回子类型的实例:
class Logger {
  final String name;
  bool mute = false;
  //工厂构造函数无法访问this,所以这里要用static
  //维护一个缓存的Map对象,
  static final Map<String, Logger> _cache =
      <String, Logger>{};
 //调用该构造函数的时候,会从Map中取出对象
  factory Logger(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final logger = Logger._internal(name);
      _cache[name] = logger;
      return logger;
    }
  }
  Logger._internal(this.name);
  void log(String msg) {
    if (!mute) print(msg);
  }
}
//调用
var logger = Logger('UI');
logger.log('Button clicked');
Flutter学习之Dart语言基础(构造函数)的更多相关文章
- Java学习笔记:语言基础
		Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ... 
- ios开发学习笔记001-C语言基础知识
		先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ... 
- Flutter学习笔记--Dart基础
		前言 Flutter使用Dart语言开发, Dart是面向对象编程语言, 由Google2011年推出, 目前最新版本是2.4.0. 工欲善其事,必先利其器. 为了更好的开发Flutter应用, 我们 ... 
- Arduino学习笔记② Arduino语言基础
		授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ... 
- ndk学习之C语言基础复习----虚拟内存布局与malloc申请
		在这一次中来学习一下C语言的内存布局,了解它之后就可以解释为啥在用malloc()申请的内存之后需要用memset()来对内存进行一下初始化了,首先来了解一下物理内存与虚拟内存: 物理内存:通过物理内 ... 
- GO学习-(20) Go语言基础之单元测试
		Go语言基础之单元测试 不写测试的开发不是好程序员.我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分. 这篇文章主要介绍下在Go ... 
- GO学习-(19) Go语言基础之网络编程
		Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ... 
- GO学习-(17) Go语言基础之反射
		Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ... 
- GO学习-(13) Go语言基础之结构体
		Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ... 
随机推荐
- Quartz.Net 学习随手记之03 配置文件
			第一种方式:直接写入代码中 NameValueCollection properties = new NameValueCollection(); properties["quartz.sc ... 
- web框架之MVC/MTV
			MVC框架 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式 Model(模型)表示应用程序核心(比如数据库记录列表) Vi ... 
- Tips for Conda
			管理环境 创建环境 基于 python3.6 创建一个名为test_py3的环境 conda create -n test_py3 python=3.6 基于 python2.7 创建一个名为test ... 
- 使用JavaScript实现量化策略并发执行
			本文代码和文章发在FMZ发明者比特币量化交易平台上: 使用JavaScript实现量化策略并发执行--封装Go函数 - 发明者量化 https://www.fmz.com/digest-topic/3 ... 
- 【ARM-Linux开发】Rico Board上编译USB WiFi RT3070驱动
			1.附件中提供了RT3070驱动源码包DPO_RT5572_LinuxSTA_2.6.1.3_20121022.tar.gz和编译好的驱动,这里选择使用taget_file.tar.gz中已经编译好的 ... 
- 51.Qt-使用ajax获取ashx接口的post数据
			由于当前C++项目需要使用ajax库去post调用ashx接口,接口地址如下所示: 需要传递的参数如下: 然后发现qml比较好调用ajax.js库,所以本章通过C++界面去获取qml方法来实现调用as ... 
- Redis HashMap 使用
			散列类型相当于Java中的HashMap,他的值是一个字典,保存很多key,value对,每对key,value的值个键都是字符串类型,换句话说,散列类型不能嵌套其他数据类型.一个散列类型键最多可以包 ... 
- (生鲜项目)07. api view实现商品列表页
			第一步: 环境配置 1. DRF官网: https://www.django-rest-framework.org/ 仔细查看自己当前的python版本以及django版本是否支持DRF, 然后就看看 ... 
- [转帖]如何禁止VirtualBox虚拟机和物理机之间的时间同步
			如何禁止VirtualBox虚拟机和物理机之间的时间同步 乐者为王 2014-11-02 706 阅读 http://ju.outofmemory.cn/entry/97301 验证了下 修改注册 ... 
- MapReduce的输入文件是两个
			[学习笔记] 1.对于MapReduce程序,如何输入文件是两个文件? 这一小节,我们将继续第一章大数据入门的HelloWorld例子做进一步的研究.这里,我们研究如何输入文件是两个文件.packag ... 
