阅读 172

Dart 学习笔记

简介

  • Dart 诞生于 2011 年 10 月 10 日

  • Dart 是谷歌开发的,类型安全的、面向对象的编程语言,被应用于 Web、 服务器、移动应用和物联网等领域。

  • Dart 运行方式

    • 原生虚拟机: Dart 代码可以运行在 Window,Mac、Linux上。
    • JavaScript 引擎 :Dart 代码可以转换成 JS 代码,运行在浏览器上。

语法基础

  • 注释语法与 JS 一致

  • 声明函数不需要关键字(JS 中通过 function 关键字来声明函数)

  • var 声明的变量其数据类型是动态的,对比 JS 不存在变量提升

  • 打印使用 print , JS 使用 console.log

  • 函数和参数前面都有类型声明

  • 每行代码结束时,必须写分号

  • 字符串可以通过引号包起来,支持模板字符串

  • main 是 Dart 入口函数, Dart 应用程序总是从 main 函数开始执行

// 声明函数
void hello(String value){
  print('Hello $value'); // 支持模板字符串
}

// 入口函数:应用在这里开始执行
void main() {
  var value='World!';  // 变量声明:使用 var 声明的变量数据类型是动态的
  hello(value); // 函数调用
}

// Console:Hello World!
复制代码

注释

  • 单行注释

    • // 我是单行注释
  • 多行注释

    • / *我是多行注释 */
  • 文档注释

    • /// 我是文档注释
    • 可以通过 dartdoc 将文档注释转成文档,文档注释支持 markdown 语法
// 我是单行注释

/* 我是多行注释 */

/// 我是文档注释 我可以被 dartdoc 转换成文档,我支持 markdown 语法
复制代码

变量

  • 变量是一个引用,Dart 万物皆对象,变量存储的是对象的引用

  • 变量声明

    • 明确指定类型:int age = 18;
    • 不明确类型:var age = 18; 或 dynamic age = 18;
  • 变量名大小写敏感

  • 变量默认值是 null

  • 变量值不会进行隐式转换,null 不会变成 false

常量

  • 常量一旦被声明,其值不可被改变

  • 声明常量

    • const age = 18;
    • final age = 18;
  • const 和 final 的区别

    • const 声明编译时能取到的值
    • final 声明运行时能取到的值
void getTime() {
  const time1 = new DateTime.now();   // 报错 - 无法将运行时的值分配给 const 变量
  final time2 = new DateTime.now();   // 成功 - 可以将运行时的值分配给 final 变量
}
复制代码

数据类型

  • Number
    • num 数字类型即可以是整数,也可以是小数
    • int 表示整数
    • double 表示浮点数,即可以是整数,也可以是小数
void main() {
  // 声明整数
  int age = 18;
  print('整数:${age}');

  // 声明浮点数
  double price = 3;
  print('浮点数:${price}');

  // 声明数值类型
  num n1 = 3.5;
  print('数值类型:${n1}');

  // 类型转换
  print('类型转换:${n1.runtimeType} 转换后类型:${n1.toString().runtimeType}');

  // 向下取整
  print('向下取整:${8.8.toInt()}');

  // 四舍五入
  print('四舍五入:${3.1415926.round()}');

  // 返回余数
  print('求余:${10.remainder(4)}');

  // 数字比较 0:相同 1:大于 -1:小于
  print('数字比较:${10.compareTo(10)}');

  // 返回最大公约数
  print('最大公约数:${12.gcd(12)}');
}
复制代码
  • String

    • 声明字符串

      • 可以使用单引号,双引号
      • 三个引号可以声明包含换行符的字符串
    • 正则表达式

      RegExp(r'正则表达式');
      RegExp(r'\d+');   // 匹配数字
      复制代码
  • Boolean

    • Dart 中通过 bool 关键字来表示布尔类型
    • 布尔类型只有两个值:true 和 false
    • 对变量进行判断时,要显示检查布尔值
  • List

    • 字面量方式

      List list = []; // 不限定元素的数据类型
      List list = <int>[]; // 限定元素的数据类型
      复制代码
    • 构造函数方式

      List list = new List.empty(growable:true); // 不限制长度的空列表
      List list = new List.filled(3,0); // 声明指定长度的填充列表
      复制代码
    • 扩展操作符

      var list = [1,2,3];
      var list2 = [0,...list]; // [0,1,2,3]
      复制代码
  • Set

    • Set 是一个无序的,元素唯一的集合

    • Set 有字面量和构造函数两种声明方式

    • 无法通过下标取值

    • 具有集合特有的操作,求交集,并集,差集等

      // 字面量
      var nums = <int>{1,2,2,3} // 1,2,3
      
      // 构造函数
      var fruits = new Set();
      fruits.add('东瓜');
      fruits.add('西瓜');
      fruits.add('南瓜');
      fruits.add('北瓜');
      
      // 集合特有的操作
      var caocao = new Set();
      caocao.addAll(['张辽','司马懿','关羽']);
      
      var liubei = new Set();
      liubei.addAll(['关羽','张飞','诸葛亮']);
      
      // 求交集
      caocao.intersection(liubei);  // {关羽}
      // 求并集
      caocao.union(liubei); // {张辽,司马懿,关羽,张飞,诸葛亮}
      // 求差集
      caocao.difference(liubei); //{张辽,司马懿}
      
      复制代码
  • Map

    • Map 是一个无序的健值对 (key-value) 映射,通常被称作哈希或字典。

    • 声明方式

      var map = {key1:value1,key2:value2};
      var map =  new Map();map['key'] = value;
      复制代码

  • 类是通过 class 声明的代码段,包含属性和方法。
    • 属性:用来描述类的变量
    • 方法:类中的函数称为类的方法
  • 对象是类的实例化结果
  • 编程方式
    • 面向对象编程(oop)
    • 面向过程编程(pop)

继承

  • 根据类的先后顺序,可以将类分成父类和子类

  • 子类通过 extends 关键字继承父类

    继承后,子类可以使用父类中可见的属性或方法

  • 子类中,可以通过 @override 元数据来标记 “覆写” 方法

  • 子类中,可以通过 super 关键字来引用父类中可见的内容

    • 属性
    • 方法(普通构造函数,命名构造函数)
class Father {
  String name = '刘备';

  String job;

  Father(this.job);

  // 命名构造函数
  Father.origin(this.job);

  say() {
    print('Father:我是$name');
  }
}

class Son extends Father {
  // 通过 super 继承父类的普通构造函数
  Son(String job) : super(job);

  @override
  say() {
    print('Son:我爹${super.name}是${super.job}');
  }
}

class Son2 extends Father {
  // 继承命名构造函数
  Son2.origin(String job) : super.origin(job);

  String name = '刘永';

  @override
  say() {
    super.say();
    print('Son2:我是二儿子,我有名字,我的名字是$name,我爹是${super.name},他是${super.job}');
  }
}

void main() {
  var father = new Father('皇帝');
  father.say();

  var son = new Son('皇帝');
  son.say(); // 子类当中有同名的方法调用自己的,如果没有则调用父类的方法 (覆写)
  print('son:我是大儿子,我没有名字,但我继承了我爹的名字,${son.name}');

  var son2 = new Son2.origin('卖草鞋的');
  son2.say();
}

复制代码

资源网站

文章分类
前端
文章标签