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语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
随机推荐
- Windows 操作系统 端口转发
在Windows 下可以使用netsh interface portproxy 命令实现端口转发功能. 例:netsh interface portproxy add v4tov4 listenpor ...
- osg fbx遍历模型节点名称
; k<sg->getNumChildren(); k++) { //转换编 std::string name = vcfbx1.w2m1(vcfbx1.m2w1(sg->getCh ...
- 关于jmeter+ant+jenkins性能自动化将测试结果文件jtl转换成html文件遇到的问题。
1.ant自身缺陷,返回结果中有特殊字符,乱码字符,无法识别,jtl文件转换时报错. 2.jtl文件过大转换成html文件时出现内存溢出. 针对以上情况:可考虑使用BeenShell Sampler: ...
- java中byte数组,二进制binary安装chunk大小读取数据
int CHUNKED_SIZE = 8000; public void recognizeText(byte[] data) throws InterruptedException, IOExcep ...
- js获取当前页面的url地址
//微信分享的时候要通过这样动态获取url传参,因为微信会对url自动加参数,所以要动态获取,不能写死url var page_url = location.href.split('#')[0];
- jenkins插件Configuration Slicing plugin批量修改配置
作用 批量修改jenkins上job配置
- 20190923-基于Python3的RobotFramework的配置是初次使用
因为最近改自动化框架在网上找了很多框架,发现RobotFramework不错,但是网上的资料很杂,现在将自己配置框架的学习笔记分享 Python配置RobotFramework的seleniumlib ...
- VMware15安装Centos7超详细过程
本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软硬件准备 软件:推荐使用VMwear15,我用的是VMwear 15 镜像: ...
- Asp.Net Core 客户端验证和远程验证
我们先来看这样一个注册页面和它的后台Model @model RegisterViewModel @{ ViewBag.Title = "用户注册"; } <h1>用户 ...
- [转帖]java的编译器,解释器和即时编译器概念
java的编译器,解释器和即时编译器概念 置顶 2019-04-20 13:18:55 菠萝科技 阅读数 268更多 分类专栏: java jvm虚拟机 操作系统/linux 版权声明:本文为博主 ...