Dart语言入门

1. 概述

  • Dart是Google发布的一门编程语言
  • Dart可用于全平台开发,主要用于跨平台移动端开发(Flutter)
  • Dart是一门面向对象语言

2 变量和常量

为了可以尽快熟悉 DartPad,你可以尝试在 DartPad 中运行一些示例,然后在 DartPad 中创建一个简单的命令行应用。

2.1 变量

  • 变量:使用var声明变量,可赋予不同类型的值;
  • 未初始化时,默认值为null;
  • 使用final声明的变量必须初始化,而只能只能赋值一次;

如上图所示

  • 用var声明变量a,打印出null,然后又被赋予10和'Hello Dart';
  • 用final声明变量c=30,当再赋值'Dart'时,编译器报错;

2.2 常量

  • 使用const声明常量;
  • 使用const声明的必须是编译期常量,即编译阶段就能确定它的值;
  • 使用const声明的常量必须初始化,而且只能赋值一次;

3 数据类型

Dart的内置数据类型有

  • 数值型-num
  • 字符串-String
  • 布尔型-bool
  • 列表-List
  • 键值对-Map
  • Runes、Symbols (几乎用不到)

3.1 数值型-num

num有两种类型:

  1. 整型-int
  2. 浮点型-double

如上图所示:

  • 声明变量a为num,a又可以赋值为10.1,所以num变量可以在整型和浮点型之间切换
  • 声明变量b为int,b不可以赋值为1.1;声明变量c为double,c不可以赋值为2,所以如果一个变量被赋值为int或double,这个变量是无法改变类型的。

数值型操作有以下几种:

  • 运算符:+、-、*、/、~/(取整)、%
  • 常用属性:isNaN、isEven、isOdd等
  • 常用方法:abs()、rount()、floor()等

3.1 字符串-String

字符串创建:

  • 使用单引号、双引号创建字符串
  • 使用三个单引号或双引号创建多行字符串
  • 使用r创建原始字符串,不对\n等转义字符串进行转义

字符串操作:

  • 运算符: +、*、==、[]
  • 插值表达式:${表达式}
  • 常用属性:length、isEmpty、isNotEmpty
  • 常用方法: contains()、subString()等

3.2 布尔型-bool

  • 使用bool表示布尔型
  • 布尔值只有true和false

3.3 列表-List

创建:

  • 创建List: var list = [1, 2, 3];
  • 创建不可变的List:var list = const [1,2,3];
  • 构造创建:var list = new List();
  • 不写泛型的时候,list的元素可以是不同类型的;

操作:

  • [],length,add(),insert(),remove(),clear()等等

3.4 键值对-Map

创建:

  • 创建Map:var lan = {"first": "dart", "second":  "java"};
  • 创建不可变Map: var lan = const {"first": "dart", "second":  "java"};
  • 构造创建: var lan = new Lan();

操作:

  • [],length,keys,values等;

3.5 dynamic

  • dynamic相当于java中的Object类

如上图所示

  • dynamic表示动态的意思,所以a可以赋值为num,也可以修改为String类型
  • 在List中,dynamic相当于Java中的Object,但是Java中的List只能存放相同类型的元素,Dart的List中可以放入不同类型的元素

4 运算符

4.1 算术运算符

  • +、 -、 *、 /、 ~/、 %
  • ++i、 i++、 --i、 i--

4.2 关系运算符

  • ==、!=、>、<、 >=、 <=
  • 判断内容相等使用==

4.3 逻辑运算符

  • !、&&、 ||
  • 针对布尔类型运算

4.4 赋值运算符

  • 基础运算符: =、??= (先判断变量是否为null,如果为null则赋值)
  • 复合运算符: +=、-=、*=、/=、%=、~/=

4.5 条件表达式

  • 三目运算符:condition? expr1 : expr2
  • ??运算符:expr1 ?? expr2

5 控制语句

5.1 条件语句

  • if
  • if ... else if
  • if ... else if ... else

5.2 循环语句

  • for
  • for ... in
  • while
  • do ... while

5.3 break和continue

  • 终止循环:break
  • 跳出当前循环:continue

5.4 switch...case

  • 比较类型:num,String,编译器常量,对象,枚举
  • 非空case必须有一个break
  • 使用default处理默认情况
  • continue跳转标签

6 方法

6.1 方法定义

返回类型 方法名(参数1, 参数2, ...){
    方法体
    return 返回值
}
  • 方法也是对象,并且有具体类型的Function

  • 返回值类型、参数类型都可以省略

  • 箭头语法: => expr 是 {return expr;}的缩写。只适用于一个表达式

  • 方法都有返回值。如果没有指定,默认return null 最后一句执行

6.2 可选参数

  • 基于命名的可选参数: {param1, param2,...},传参时必须填写参数名:参数值
  • 基于位置的可选参数: [param1, param2,...],传参是直接填写参数值
  • 如果存在固定参数,可选参数必须在固定参数后面

6.3 默认参数值

  • 使用 = 在可选参数指定默认值
  • 默认值只能是编译时常量

6.4 方法对象

  • 方法可以作为对象赋值给其他变量
  • 方法可以作为参数传递给其他方法

6.5 匿名方法

(param1, param2, ...) {
    ...
    return value;
}

  • 可以赋值给变量,通过变量进行调用

  • 可以在其它方法中直接调用或传递给其它方法

6.6 闭包

  • 闭包是一个方法
  • 闭包定义在其它方法内部的方法
  • 闭包能访问外部方法内的局部变量,并持有其状态

  • 如上图所示,printCount就是一个闭包

7 面向对象

7.1 类与对象

  • 使用class声明一个类
  • 使用关键字new创建一个对象,new可以省略
  • 所有对象都继承于Object类
  • 属性默认会生成getter和setter方法
  • 使用final声明的属性只有getter方法
  • 方法不能被重载

  • 默认情况下,每个Dart文件就是一个库
  • 使用_表示库的私有性
  • 使用import导入库

7.2 计算属性

  • 计算属性的值是通过计算而来,本身不存储值
  • 计算属性赋值,其实是通过计算转换到其它实例变量

7.3 构造方法

  • 如果没有自定义构造方法,会有默认的构造方法
  • 如果存在自定义构造方法,默认构造方法无效
  • 构造方法不能重载
  • 如果想使用多个构造方法,需要使用命名构造方法
    • 使用类名.方法的形式实现

7.4 常量构造方法

  • 如果类是不可变状态(必须初始化,且只能被设置一次),可以把对象定义为编译时常量
  • 使用const声明构造方法,并且所有变量都为final
  • 使用const声明对象,可以省略

7.5 工厂构造方法

  • 类似于工厂模式
  • 在构造方法前添加factory实现一个工厂构造方法
  • 在工厂构造方法中返回对象

7.6 初始化列表

  • 初始化列表在构造方法体执行之前执行
  • 使用逗号分隔初始化表达式
  • 初始化列表常常用于设置final变量的值

7.7 静态成员

  • 使用static关键字来实现类级别的变量和函数
  • 静态成员不能访问非静态成员,非静态成员可以访问静态成员
  • 类中的常量需要使用static const声明

7.8 对象操作符

  • ?.表示前面对象为空就不往下执行了
  • 类型转换 as
  • 是否指定类型:is,is!
  • 级联操作:..

7.9 对象call方法

  • 如果类实现了call方法,则该类的对象可以作为方法来使用

7.10 继承

  • 使用extends继承
  • 子类会继承父类可见的属性和方法,不会继承构造方法
  • 子类能复写父类的方法
  • 单继承、多态性

7.11 继承中的构造方法

  • 子类的构造方法默认会调用父类的无名无参的构造方法
  • 如果父类没有无名无参构造方法,则需要显式调用父类构造方法
  • 在构造方法参数后使用:显式调用父类构造方法

  • 父类的构造方法在子类构造方法执行之前的位置调用
  • 如果有初始化列表,初始化列表会在父类构造方法之前执行

7.12 抽象类

  • 抽象类使用abstract表示,不能直接被实例化
  • 抽象方法不用abstract修饰,无实现
  • 抽象类可以没有抽象方法
  • 有抽象方法的类一定要声明为抽象类

7.13 接口

  • 类和接口是统一的,类就是接口
  • 每个类都隐式的定义了一个包含所有实例成员的接口
  • 如果复用已有类的实现,使用extends
  • 如果只是使用已有类的外在行为,使用implements

7.14 Mixins

  • Mixins类似于多继承,是在多类继承中重用一个类代码的方式
  • 使用关键字with
  • 作为Mixins的类不能有显式构造方法
  • 作为Mixin的类只能继承自Object

7.15 操作符覆写

  • 复写操作符需要在类中定义
  • 如果需要复写==,还需要复写对象的hashcode getter方法,和Java相同
Type operator 操作符(param1, param2,...) {
    ...
    return value
}

以下操作符可以复写:

8 枚举和泛型

8.1 枚举

  • 一种有穷序列集的数据类型
  • 使用关键字enum定义一个枚举
  • 常用于代替常量,用于控制语句中
  • index从0开始,依次累加
  • 不能指定原始值
  • 不能添加方法

8.2 泛型

  • Dart中类型是可选的,可使用泛型来限定类型
  • 使用泛型能有效减少代码重复
  • 和Java一样,可以在类和方法上使用泛型

猜你喜欢

转载自blog.csdn.net/qq_36986015/article/details/111030474