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 = 0;
    this.y = 0;
  }

 //创建一个坐标为(100, 100)的类
 Point.coordinate100(){
    this.x = 100;
    this.y = 100;
  }
  @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, 0);
}

常量构造函数

如果你的类需要成为永远不会更改的对象,则可以使这些对象成为编译时常量。 定义const构造函数要确保所有实例变量都是final。

class Point {
  final num x;
  final num y;
  static final Point2 origin = const Point2(0, 0);

  //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‘);

原文地址:https://www.cnblogs.com/Free-Thinker/p/10838403.html

时间: 2024-07-31 10:04:56

Flutter学习之Dart语言基础(构造函数)的相关文章

Dart语言基础

dart 语言是一款谷歌出的语言,代码风格更像是融合了 java 及 javascript,所以学习的难度并不是很大: 且又是 flutter 框架中的语言,所以还是有学习的必要 dart 安装:打开 dart 官网 我们按照安装步骤下载完了,然后我们检测是否下载成功:在终端输入命令:dart --version 如果出了版本号就证明我们下载成功了 如果我们想在使用 dart 语言的话,建议使用 vsCode 的编辑器,下载插件 dart  code runner dart 文件,是以 dart

【dart学习】-- Dart之基础语法

一,重要概念 所有你能够赋值给一个变量的都是一个对象,无论是变量,数字,函数等都是一个对象.所有的对象都是类的一个实例.所有的对象都继承自内置的Object类.这一点类似于Java语言“一切皆对象”. 虽然Dart是强类型语言,但是类型声明是可选项(即不是必须的),因为Dart可以自己去推断类型.这点与JS和Swift很类似.比如var number = 1,变量number就被推断为int类型.当你想明确说没有类型时,可以使用特殊类dynamic/object声明(详情下面会讲到). Dart

Go学习笔记(2) 语言基础和数值布尔类型

  1. Go语言环境变量 Go语言开发环境依赖一些操作系统环境变量,常用的环境变量如下: $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方. $GOARCH 表示目标机器的处理器架构,它的值可以是 386,amd64 或 arm. $GOOS 表示目标机器的操作系统,它的值可以是 darwin,freebsd,linux 或 windows $GOBIN 表示编译器和链接器的安装位置,默认是 $GOROOT/bin,如果你使用的

MySQL学习笔记_8_SQL语言基础复习

 SQL语言基础复习 一.概述 SQL语句注释方式 1)以"#"开头直到行尾的所有内容都是注释 2)以"--"(--后还有一个空格)开头直到行尾的所有内容都是注释 3)以"/*"开始,以"*/"结束的所有内容都是注释,可用于注释多行 二.数据库操作 1.创建数据库 create database db_name; db_name命名规则: 1)名称可由任意字母,数字,"_"或"$"组

GO学习-(8) Go语言基础之数组

Go语言基础之数组 Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基本语法: // 定义一个长度为3元素类型为int的数组a var a [3]int 数组定义: var 数组变量名 [元素数量]T 比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分.一旦定义,长度不能变. [5]int和[10]int是不同的类型. var a [3]int var b [4]int a =

Dart语言--基础内容

基础 主函数 void main ( ) { } 声明变量 var a num a int a double a bool a = true final b = 0; 声明只能赋值一次的变量 const a = 1; 常量 var a = const [1,2]; 声明一个不可变的list 数据类型 数据类型 Number Int --整数型 double -- 浮点型 String Boolean List -- 数组 Map -- 键值对 特殊运算符 ~/ 向下取整 字符串操作 ''' he

[java学习笔记]java语言基础概述之数组的定义&amp;常见操作(遍历、排序、查找)&amp;二维数组

1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一旦创建,必须明确长度)          格式1:              元素类型   [ ]  数组名  =  new  元素类型  [元素个数即数组的长度]:              示例:int[] array = new int[5];          格式2:           

【C/C++学习】C语言基础知识积累

把在C语言学习过程的知识记录下来,积少成多. 1.各种特殊字符 \n 换行 :\r 输出指针移到当前位置 :\b 去掉一个前面的字符 :\t  制表对齐 :\f 换页符

Python学习笔记之语言基础与流程控制

Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. Python的特点 Python 优点 1.简单.优雅.明确 2.强大的模块第三方库 3.易移植 4.纯面向对象语言 5.可扩展性良好(c\java\c#...) Python缺点 1.代码不能加密 2.执行速度慢 Python能做什么 1.软件开发 1.游戏后台.搜索.图形界面 2.