dart学习(十)

dart学习(1) - 语言分类,dart运行,dart语法 前言 接上篇flutter学习(1), 阅读详情

class类

概述:类是对一类具有相同特征事物的描述,是实例的构造模板,是一个抽象概念 。例如,造汽车,首先我们得有制造图纸,图纸上绘汽车的底盘,轮胎,发动机等等,而我们根据图纸制造的出来的车就是这个图纸的一个实例(即类的实例化)。根据图纸我们我可制造很多相同的汽车出来,为了区分它们,我们会给每辆汽车一个编号,对应到代码层面,也就是一个类可以构造出多个数据结构相同的实例对象,而我们通过不同的引用来找到它们,实例化的时候系统会给每个实例在内存分配一个地址值来区分们,引用指向它们的地址值。

dart是一门面向对象语言,并且基于mixin-based多继承,每个对象都是一个类的实例。

1、类的声明:  class  类名 {}

以下划线或者大写字母开头,可以包含数字$(当然如果你小写字母开头并不会报错,但是约定俗成的都是以大写字母或下划线开头)

class Person {}

class _Person {}

注意:如果以下划线开头,表示这个类是私有的,只能在当前文件使用。

2、类的组成:方法,属性,构造器 

//一个简单类的声明
class Test {
  String name;
  Test(this.name);
  say() {}
}

①类的方法,分为静态方法和实例方法,静态方法用static关键字修饰,是属于类本身的

静态方法调用:类名.方法名()

实例方法调用:实例.方法名()

void main() {
  //类的方法调用
  Person.say();
  //实例方法调用
  Person p = new Person();
  p.eat();
}

class Person {
  static say() {
    print("静态方法");
  }

  eat() {
    print("实例方法");
  }
}

②类的属性,分为静态属性和实例属性

静态属性使用static  const 声明,并且在声明类的时候必须给其赋值

void main() {
  print(Person.age);
}

class Person {
  static const age = 23;
}

实例属性分为常量属性和变量属性,常量属性使用final关键字修饰,必须在实例化或者类声明的时候赋值,常量属性赋值后不能被修改。变量属性可以在实例化对象后通过对象来赋值

void main() {
  Person p = new Person("sixleg");
  p.age = 23;
  print(p.nation); //China
  print(p.name); //sixleg
  print(p.age); //23
}

class Person {
  final String nation = "China"; //常量属性,类声明时赋值
  final String name; //常量属性,实例化时赋值
  int age; //变量属性
  Person(this.name);
}

建议使用"?."代替"."来给实例属性赋值,这样可以避免当引用的值为null时程序报错

var p;
p.age = 23; //报错
p?.age = 23; //不会报错,如果p不为null,则赋值

③类的构造器,又叫构造方法

在dart中构造器不能被子类继承,构造器通过ClassName或者ClassName.identifier来命名,如果不显示声明构造器,dart会给每个类隐式添加一个无参名字跟类名相同的构造器,如果显示声明了构造器,则这个构造器不会存在,一个类可以有多个构造器。

class Person {
  String name;
  int age;
  Person() {} //无参构造器
  Person.fillName(String name) { //位置参数
    this.name = name;  //this关键字指向当前的实例对象
  }
  Person.fiiAge({int age}) { //命名参数
    this.age = age;
  }
}
//构造器可以简写,下面这种写法跟上面效果一样
//class Person {
//  String name;
//  int age;
//  Person();
//  Person.fillName(this.name);
//  Person.fiiAge({int this.age});
//}

构造器的调用,类实例化对象时调用对用的构造器,通过new关键字或者像调用函数那样调用

void main() {
  var p1 = new Person();
  var p2 = Person.fillName("六只脚");
  var p3 = Person.fiiAge(age: 23);
}

常量构造器,当你构造的对象不会被改变时,可以使用常量构造器,在构造器前面加上const关键字修饰,当一个类声明了一个常量构造器,则不能存在非常量构造器,并且这个类中的实例属性必须声明为常量属性,且必须在声明或者实例化时被初始化。当使用const调用常量构造器时,如果参数相同,则为同一实例对象。

void main() {
  var p = const Person(23);
  var p2 = const Person(23);
  var p3 = const Person(27);
  var p4 = Person(23);
  var p5 = Person(23);
  print(p == p2);    //true
  print(p == p3);    //false    
  print(p == p4);    //false
  print(p4 == p5);    //false
}
class Person {
  final int age;
  const Person(this.age);
  static Person person = const Person(18);    
}

通过runtimeType属性来获取实例对象的类型

var p = Person();
print(p.runtimeType); //Person

重定向构造器,重新定向到该类的另一个构造器

class Dog {
  String name;
  int age;
  Dog(this.name, this.age);
  //重定向到该类的主构造器,主构造器指与类名相同的构造器,当然,也可以定向到其它构造器
  Dog.fillName(String name) : this(name, 23); 
}

工厂构造器,通过factory关键字来声明,如果创建的对象相同,则不需要重新创建,直接从缓存的返回对象(工厂构造器里不能使用this关键字)

main() {
  Dog d = Dog("six");
  Dog d1 = Dog("six");
  print(d == d1); //true
  d.name = "leg";
  print(d1.name); //leg
}

class Dog {
  String name;
  static final Map<String, Dog> _cache = <String, Dog>{};
  factory Dog(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final dog = Dog.getDog(name);
      _cache[name] = dog;
      return dog;
    }
  }
  Dog.getDog(this.name);
}

④抽象类

使用关键字abstract来修的类称为抽象类,抽象类可以有静态方法,静态属性跟实例方法和实例属性,抽象类的实例方法的方法体可以省略,至于为什么什么后面接口的实现会提到。一般抽象类用来定义接口,抽象类不能被实例化,如果想实例化抽象类,可以使用factory工厂构造器。

abstract class Person {
  int age;
  final String name;
  Person(this.name);
  void say();
  static eat() {}
}

⑤接口的实现

dart的每个类都隐式定义了一个接口(不管是一般类还是抽象类),接口中包含该类的所有实例成员(构造函数不包括),如果你想不在继承的情况下一个类A支持另一个类B的API,则类A可以使用关键字implements来实现B的接口,一个类可以实现一个或多个类的接口。

abstract class Person {
  int age;
  final String name;
  Person(this.name);
  void say();
  static eat() {}
}

class Man implements Person {
  get age => this.age;
  set age(int age) => this.age = age;
  void say() {}
  get name => this.name;
}

注意:当A类实现B类的接口时,A类中必须重写B类中所有实例属性的getter和setter方法,如果属性是final修饰的常量,则只需重写getter方法,实例方法也要被重写。这也是前面提到抽象类的方法体被可以省略的原因,因为抽象类一般是为了定义接口,接口中的方法要被实现的类重写,所以在接口中的实例方法体体也就没有意义。

⑥类的继承

如果你想创建一个子类,请使用关键字extends,子类中会隐式添加一个super属性,super代表父类。继承是单继承的,这与接口实现不同,一个子类只能有一个父类。

子类不能继承父类的构造器,子类的构造器会默认调用父类的无参主构造器(与类同名的构造器),如果子类想调用父类的其它构造器则需手动调用,如果父类不存在这个构造器,则不能调用,子类也不能声明带此参数的构造器。

void main() {
  Man.fill(); //默认调用父类的Person()构造器
}

class Person {
  int age;
  Person();
  Person.fill(this.age) {
    print("super fill");
  }
}

class Man extends Person {
  Man();
  Man.fill();
}

使用冒号:来调用父类构造器,且子类构造器不能简写,可以省略花括号。

class Animal {
  int age;
  Animal();
  Animal.withAge(this.age);
}

class Cat extends Animal {
  Cat(int age) : super.withAge(age);
}

方法的重写,子类可以重写父类的方法,通过super.methodName()调用父类的方法,dart中方法不能重载,这与java不同

class Animal {
  say() {}
}

class Cat extends Animal {
  @override
  say() {
    super.say();
  }
}

⑦mixin,(混入的意思)给一个类添加特征,使用关键字with

class Musician extends Performer with Musical {
  // ···
}

class Maestro extends Person
    with Musical, Aggressive, Demented {
  Maestro(String maestroName) {
    name = maestroName;
    canConduct = true;
  }
}

为了使用mixin,我们必须创建一个继承Object类的类,并且不能声明构造器,使用mixin关键字代替class关键字

mixin Musical {
  bool canPlayPiano = false;
  bool canCompose = false;
  bool canConduct = false;

  void entertainMe() {
    if (canPlayPiano) {
      print('Playing piano');
    } else if (canConduct) {
      print('Waving hands');
    } else {
      print('Humming to self');
    }
  }
}

可以通过关键字on指定mixin只允许哪个类使用

mixin MusicalPerformer on Musician { //只有Musician能使用
  // ···
}

 

Dart学习之关于Dart与Dart的安装使用 关于Dart Dart语言于2011年10月10日由谷歌公司开发出的网络编程语言,Dart可以用作网页脚本、可以直接在Chromium浏览器中运行Dart程序,可靠的DartVm有助程序性能提升与安全。 Dart可以被转换为Java代码,也可以用来编写桌面应用程序。Dart是一种易于学习、易于扩展、并且可以部署到任何地方,Google使用Dart来开发大型应用。 使用场景 由上图可知:Dart在... 阅读详情

相关推荐

DART booster

DART booster的介绍,本文通过翻译XGBoost官方文档以及理解DART booster原文得来,帮助大家理解DART booster的原理。

Yongchun_Zhu的博客 5390

【Flutter】Dart学习笔记

1 变量(Variables) var name = 'Bob'; Dart可自动推断变量的类型,也可以为变量指定类型,如果一个对象的引用不局限于单一的类型,可以将其指定为 Object(或 dynamic)类型。推荐通过 var 声明局部变量而非使用指定的类型 未初始化变量默认值为null,包括数字,因为在 Dart 中一切皆为对象,包括数字。 Final和Const 这两个关键字可以替代 var 关键字或者加在一个具体的类型前。一个 final 变量只可以被赋值一次;一个 const 变量是一个编译时

sinat_36955332的博客 593

Dart语言的学习路线

Dart是一种由Google开发的编程语言,最初设计用于构建Web应用程序。随着Flutter的兴起,Dart逐渐成为移动和Web开发的热门语言。如果你对Dart感兴趣并想深入学习本文将为你提供一条清晰的学习路线,帮助你从初学者成长为Dart开发专家。

2501_90468191的博客 419

Dart 2.6 正式发布, 新增利器 dart2native: 将 Dart 编译为自包含的本地可执行文件

作者: Michael Thomsen, Dart & Flutter Product Manager, GoogleDart 提供了丰富多样的编译器,全方位助力...

谷歌开发者 3007

计算机保研/考研面试题——计算机组成原理篇

本文总结了985和华五学校习计算机保研/考研常问面试时的计算机组成原理题,欢迎点赞、收藏、评论、关注

安晴晚风的博客 7547

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

【Dart】Dart学习(十)异步支持

Dart学习(十)异步支持

每天不是在写bug就是在写bug的路上 800

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5564

Dart语言学习(十) Dart流程控制语句

一、条件语句:if、if...elseif、if...elseif...else int score = 95; if (score >=90) { print('优秀'); } else if (80>=score && score<90) { print('良'); } else if (60>=score &...

鸿鹄当高远 461

FPGA_AD9361实战

1.参考网站。

Pual_Georg的博客 748

企业微信自建应用全流程部署指南:从HTTPS到API调试

本文提供了一份详尽的企业微信自建应用部署指南,涵盖从HTTPS域名配置、Nginx反向代理到企业微信后台应用创建与API调试的全流程。核心在于构建一个符合企业微信安全要求的“可信”服务环境,并利用JupyterLab等工具进行高效调试,帮助企业快速完成内部系统与企业微信的集成。

weixin_29247219的博客 422

Dart语言零基础学习笔记(十)

Dart语言零基础学习笔记(十) 面向对象的三个基本特征 三大基本特征:封装、继承、多态 Dart系统内置的类 Dart自定义类

qq_43336158的博客 277

Python 爬虫实战:豆瓣 / IMDB 电影数据抓取(评分 + 剧情 + 演员阵容结构化处理)

在数据为王的时代,电影数据是进行市场分析、推荐系统构建和学术研究的重要资源。豆瓣和 IMDB 作为国内外最具影响力的电影评分和资讯网站,包含了海量高质量的电影数据。本文将带领你从零开始,构建一个健壮的 Python 爬虫,用于抓取豆瓣和 IMDB 的电影信息,并将其中的非结构化数据(如剧情简介、演员列表)进行清洗和结构化处理,最终存储到便于分析的结构化文件(如 CSV)中。

yansideyucsdn的博客 954

dart语言学习(十)— 逻辑运算符

运算符 运算符:!、&amp;&amp;、|| 针对布尔类型运算 案例 void main(List&lt;String&gt; args) { bool isTrue = true; print("!isTrue = ${!isTrue}"); bool isFalse = false; print("isTrue &amp;&amp; isFalse =${isT...

黄孝果的博客 823

基于STM32设计的老人监护系统(OneNet)_118

该项目是基于STM32设计的老人监护系统。本系统可以通过脉搏心率传感器,体温传感器检测老人的脉搏状态,体温状态,把老人的数据状态在STM32单片机内部进行处理,然后通过GSM模块上传到OneNet云平台,在通过可视化界面显示出来,这样可以让子女随时随地了解到老人现在的身体情况,以便对老人的突发情况能够做出及时的预防和处理。而且如今,随着老人年纪不断的增长,身体体质不断的衰弱,在上楼梯或者走斜坡的时候很容易会发生摔倒或跌倒,如果不及时的接收到治疗,很可能会造成很严重的后果。

7456

Host是如何与EC通信的

EC中有三个寄存器,分别为状态寄存器EC_SC、命令寄存器EC_SC和数据寄存器EC_DATA。而状态寄存器和命令寄存器同属于一个寄存器,这几个寄存器遵循着ACPI EC规范。host可以根据ACPI协议规范来与EC进行通信。 以下是个寄存器的详细介绍。 EC状态寄存器(EC_SC(R)),该寄存器是一个只读寄存器,它反映了此时EC接口的状态。下图为该寄存器表。 EC状态寄存器表中各位的具体含义: OBF(Output Buffer is Full),该状态位置1...

qq_30135687的博客 3693

学习Dart的10个理由

From: https://hackernoon.com/10-good-reasons-why-you-should-learn-dart-4b257708a332

编程故事的地方 151

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Dart中FFI学习

Dart中如何与C语言交互

yong_19930826的博客 1725

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Dart学习

Flutter是一个开源的UI软件开发工具包,由Google创建,用于构建跨平台的美观、高性能的移动、Web和桌面应用程序。Flutter的核心设计理念是一切皆为widget(组件),这意味着Flutter中的每个元素都是一个widget,从简单的文本到复杂的布局结构。在Flutter中,基本布局widget是构建界面的基石。例如,AppBar是一个在屏幕顶部显示内容和操作的容器,通常用于显示应用程序的名称和主要操作。Scaffold。

hahaha的博客 1305

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Dart学习记录

通过 library 来声明库- 每个Dart文件默认都是一个库,只是没有使用library 来显示声明。- Dart使用_(下划线)开头的标识符,表示库内访问可见(私有)。- library 关键字声明的库名称建议使用:小写字母+下划线。通过 import 来引入库- 不同类型的库,引入方式不同: 自定义库(import ‘库的位置/库名称.dart’),系统库(import ‘dart:库名称’),第三方库。

iamyang0511的博客 653

利用DART重制的SM-2算法:高效学习的科技之钥

利用DART重制的SM-2算法:高效学习的科技之钥 在信息爆炸的时代,如何高效记忆知识成为了一大挑战。今天,我们向您隆重推介一个基于DART实现的开源项目——SM-2算法实现,它为您的学习旅程提供了一个强大而简单的工具。 项目介绍 SM-2算法,即简单间隔重复算法,是超级记忆法(SuperMemo)系列中的一员,由波兰学者Piotr Wozniak提出。该算法通过评估您当前对知识点的记忆难易程度,...

gitblog_00194的博客 1080
上一篇: dart学习(九)
下一篇: cross-env插件
feral_coder
博客等级 码龄9年 19粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值