在学习本篇内容之前请先学习一、半天时间掌握Dart开发语言-基础学习_WEB前端李志杰的博客-CSDN博客 掌握Dart开发语言的基础。

Dart 是面向对象的编程语言,Dart中类的很多概念跟其他语言中类的很多概念基本一致,但是Dart中的类加入一些独有的特性。

文中如有错误之处,还望在评论区指出。

一、定义实例对象属性及实例对象方法

如下示例中,pPerson类的实例对象,nameage为实例对象上的属性,run()为实例对象上的方法。

void main() {Person p = new Person();p.name = 'lili';p.run();
}
class Person {String? name;int? age;run() {print('$name + $age');}
}

二、类私有属性及私有方法(在定义变量名时在前面加 _

私有属性及私有方法只能在类的内部访问和调用,不能通过实例对象访问和调用。

属性及方法私有化的主要目的是为了不让通过实例对象对类的属性值修改,或通过实例对象调用类里面的方法。

如上一个示例中可以使用p.name = 'lili' 直接修改Person类中name属性的值,也可以通过实例对象p 调用Person类中的run 方法。

注:同一文件内,实例对象是可以访问类中的私有属性及私有方法的。

// main.dart
void main() {Person p = new Person();// 不能通过实例对象p访问_name、_age属性及_run方法p.name = 'lili'; // 这一行会报错p.console();
}
// person.dart
class Person {// 私有属性String? _name;int? _age;// 私有方法_run() {print('$_name + $_age');}console() {_run();}
}

三、静态属性及静态方法

静态属性及静态方法不可以通过实例对象访问,只能通过类名访问。

静态属性不能被构造函数初始化且不能定义为私有属性,即使在变量名前加_在外部依然可以访问。静态属性在内存中独一份,只要有一处修改静态属性name的值为lili,则所有StaticClass.name 的值都是lili

静态方法中可以访问静态属性,但是不可以访问实例属性及私有属性。实例方法中既可以访问静态属性也可以访问实例属性。

常量属性(const关键字声明的属性)必须为静态属性(必须使用static修饰)。

void main() {// 静态属性及静态方法访问StaticClass._name = 'xuesheng';StaticClass.run();// 非静态属性及其方法的访问StaticClass sc = StaticClass();sc.run1();
}
class StaticClass {// 静态属性static String _name = 'lili';// 实例属性int age = 0;// 静态方法static run() {print('$_name');}// 实例方法run1() {print('$_name+$age');}
}

四、 构造函数

Dart中构造函数的函数名与类名相同且不能被显式调用,没有返回值类型、也没有返回值,构造函数在实例对象被创建时自动执行。

当用户没有显式的去定义构造函数时, 编译器会为类生成一个默认的构造函数, 称为 “默认构造函数”, 默认构造函数不能完成对类数据成员(属性和方法)的初始化, 只能给实例对象创建一标识符, 并为实例对象中的数据成员开辟一定的内存空间。

构造函数的主要作用:

构造函数主要用来在创建实例对象时完成对对象属性的一些初始化等操作, 当创建实例对象时, 实例对象会自动调用它的构造函数。

一般来说, 构造函数有以下三个方面的作用:

  1. 给创建的对象建立一个标识符;

  2. 为对象数据成员开辟内存空间;

  3. 完成对象数据成员的初始化。

构造函数分为:无参构造和有参构造,我们主要学习有参构造。

void main() {Person p = new Person('lili', 20);p.run();
}
class Person {String? _name;int? _age;// 重写的构造函数Person(String name, int age) {_name = name;_age = age;}run() {print('$_name + $_age');}
}

构造函数形参和实参一样的情况下,dart可以进行简化开发,如下:

void main() {Person p = new Person('lili', 20);p.run();
}
class Person {String name;int age;// 构造函数Person(this.name, this.age);run() {print('$name + $age');}
}

我们可以结合之前学习的可选参数,实现如下效果。如果构造函数的参数为可选参数则所有 可选参数都必须有默认值,或者标识其为必传。

void main() {Person p = Person(nameValue: 'lili', ageValue: 18);p.run();
}
class Person {String? name;int? age;// 构造函数Person({String nameValue = '', required int ageValue}) {name = nameValue;age = ageValue;}run() {print('$name + $age');}
}

五、命名构造函数

命名构造函数:dart提供的一个新概念,即可以指定一个指定名称的函数作为构造,使用如下:

void main() {Person p = Person('lili', 18);p.run();
}
class Person {String name;int age;// 构造函数Person(this.name, this.age);// 命名构造函数Person.init(this.name, this.age);run() {print('$name + $age');}
}

六、初始化列表

初始化列表会在构造函数方法体执行之前执行,多个初始化列表表达式之间使用 分割。

初始化列表主要作用:对final 修饰的实例对象属性赋值和对构造函数的形参进行校验。

初始化列表常用于设置final修饰的属性的值。

初始化列表中可以使用assert进行判断参数。

先按顺序执行初始化列表中的内容,然后再执行构造函数方法体中的内容。

void main() {Person p = Person({'name': 'lili', 'age': 18, 'height': 10});p.run();
}
class Person {String name;int age;int height;// 命名构造函数Person(info): name = info['name'],age = info['age'],height = info['height'] {print(height > 100);}run() {print('$name + $age + $height');}
}

七、常量构造函数

类中所有属性都必须使用final 修饰,则可以使用const 修饰构造函数,此时该构造函数为一个常量构造函数。其内部属性的值在构造函数初始化完成之后,所有属性的值是不允许被修改的。

常量构造函数的作用:多次调用常量构造函数时,如果传递一样的实参将获取同一实例对象,从而节省内存开销和运行效率。

注:常量构造函数,只能是类默认的构造函数且必须有参数,所有的属性都必须使用final修饰。

void main() {Person p = const Person('lili', 18);Person p1 = const Person('lili', 18);print(p == p1); // truep.run();
}
class Person {final String name;final int age;const Person(this.name, this.age);run() {print('$name + $age');}
}

八、工厂构造函数(单例对象)

常量构造函数的弊端就是,构造函数传入的实参必须是一样的,如果多个实参中有一个实参的值不一样,最终都将得到不同的实例对象。

注:工厂构造函数必须用factory修饰,否则,不能return

void main() {FactoryClass fc1 = FactoryClass();FactoryClass fc2 = FactoryClass();print(fc1 == fc2); // true
}
class FactoryClass {static FactoryClass? _instance;// 由于构造函数内部不能调用自己,可以使用命名构造函数解决factory FactoryClass() => _instance ??= FactoryClass.init();FactoryClass.init();
}

九、 类的继承

Dart中类的继承会继承除了构造方法以外的所有属性及方法。

void main() {Student s = Student.init("一年级一班", 'lili', '小李子', 6, 120);print(s._height);print(s.age);print(s.name);print(s.className);print(s.subName);
}
class Person {String name;int age;int _height;bool isFree() => _height < 100;Person(this.name, this.age, this._height);getInfo() {print("姓名:$name,年龄:$age,身高:$_height");}
}
class Student extends Person {String className;String subName;// 以下这行代码,采用构造函数及初始化列表两种形式完成了对Student类中实例对象属性的初始化工作Student.init(this.className, String name, String subNameValue, int age, int height): subName = subNameValue,super(name, age, height);@override// 属性重写bool isFree() => age < 100;@override// 方法重写getInfo() {return super.getInfo();}
}

十、抽象类

抽象类不能被实例化,如果只是继承一个抽象类,可使用extends 关键字。如需继承多个抽象类则需要使用implements关键字。

implements关键字既可以继承抽象类也可以继承普通类,在继承了普通类之后也需要实现普通类中的所有属性及方法。

// 抽象类
abstract class AbstractClass {// 抽象方法,抽象方法只能放在抽象类中,抽象方法只能由子类实现int sum(int value1, int value2);
}
class Class {int value1;int value2;Class(this.value1, this.value2);int sum1() {return value1 + value2;}
}
class SubClass implements AbstractClass, Class {// 实现抽象类中的方法@overrideint sum(int value1, int value2) {return value1 + value2;}// 实现普通类中的属性和方法@overridelate int value1;@overridelate int value2;@overrideint sum1() {// TODO: implement sum1throw UnimplementedError();}
}

十一、混入Mixins

为了弥补extends 只能继承一个类的不足,dart中新增一个类的特性,即mixins(混入),以实现同时继承多个类的属性和方法。

如果混入的多个类中的属性名或者方法名称一样,则实际为最后一个。

混入的类不可以实现构造方法或继承别的类。

void main() {SubClass sc = SubClass(10, 20);print(sc.sum1());sc.run();
}
class Class1 {int value1;int value2;Class1(this.value1, this.value2);int sum1() {return value1 + value2;}
}
class Class2 {run() {print('Class-----');}
}
class SubClass extends Class1 with Class2 {SubClass(int value1, int value2) : super(value1, value2);
}

十二、复写操作符运算

可以通过operator关键字,定义复写的操作运算符。

void main() {OperatorClass op1 = OperatorClass(28);OperatorClass op2 = OperatorClass(20);print(op1 > op2); // true
}
class OperatorClass {int age;OperatorClass(this.age);bool operator >(OperatorClass other) => age > other.age;
}

至此,Dart这门开发语言已经全部介绍完毕,如有疑问可在评论区留言。

往期内容:

一、【Flutter开发环境搭建】Java SDK安装

二、【Flutter开发环境搭建】Android SDK、Dart SDK及Flutter SDK安装_

三、Flutter Navigator路由传参

四、flutter全局状态管理Provider

五、半天时间掌握Dart开发语言-基础学习

二、半天时间掌握Dart开发语言-类的学习相关推荐

  1. Dart 开发语言概览

    本文将从变量和运算符开始到类和库的使用来向你介绍 Dart 编程语言的主要功能,这里假设你已经有使用其它语言进行编程的经验. 你可以通过查看 Dart 库概览 学习更多关于 Dart 核心库的知识.若 ...

  2. Dart开发之——类,kotlin可变长参数

    late int age; //姓名 late String name; } main() { var people = People(); people.name = "张三"; ...

  3. 一篇文章看懂有关iOS开发语言的一切!

    看什么看!点我呀!全栈程序员,免费入门到精通! 作者丨开发之家 https://www.jianshu.com/p/1fd231cfe54b 前言 iOS开发语言有哪些?OS开发语言主要包括什么?iO ...

  4. arduino与java,Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境

    Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境 更多相关问题 听力原文:W: Hi, Steve, good to see you are up and around a ...

  5. solidworks api二次开发实例详解_Solidworks开发语言对比及分析

    很多初学Solidworks二次开发的同学,也许都会纠结使用何种语言进行二次开发.对于Solidworks二次开发的语言,官方有VBA,VB.NET,C#以及C++,四种语言. 用户通常会有如下疑问, ...

  6. (Unity游戏开发)五天时间做出一款饥荒类的生存游戏Demo,项目在手,还怕面试官不给offer?

    游戏行业作为当下最火热的行业之一,受到了很多人的喜爱,也有很多同学想要进入游戏开发行业,但常常找不到靠谱的学习资源,不知道如何在入行前拥有项目经验,我为大家准备了最实用的unity游戏开发学习资料,助 ...

  7. 使用Dart/Flutter语言开发的命令行文字RPG类型小游戏

    使用Dart/Flutter语言开发的命令行文字RPG类型小游戏 项目源码:https://gitee.com/FantasyWind/word_game 介绍 项目背景 本项目为使用Dart/Flu ...

  8. HBuilder开发旅游类APP(二) ----- mui结合H5+,快速实现首页、登录、注册等功能

    HBuilder开发旅游类APP(二) ----- mui结合H5+,快速实现首页.登录.注册等功能 作者:班尼科 本博文是本人原创,喜欢请给我点赞,转载请注明出处哦. 标签: 旅游 H5+ MUI ...

  9. 用Django半天时间开发一个员工管理系统实例教程分享

    熟悉python的朋友都知道,django简直是web开发领域的一个大杀器. 请求.模板.ORM.admin 都自带,程序员可以很轻松的开发出一个网站或者管理系统. 今天小编给大家分享一个超简单的员工 ...

最新文章

  1. ​使用端到端立体匹配网络进行单次 3D 形状测量,用于散斑投影轮廓测量
  2. Activiti工作流从入门到入土:整合spring
  3. 爬虫css选择器,选择属性
  4. LintCode_173 链表插入排序
  5. 网页设计相关计算机语言,title(计算机语言)
  6. POJ - 2065 SETI(高斯消元解方程(取模))
  7. kotlin学习之lambda(十)
  8. 自然语言处理中的模式(模式0:模式无处不在模式)
  9. sklearn 线性回归_使用sklearn库做线性回归拟合
  10. 实例63:python
  11. vue Bus 总线 组件间通信
  12. python 字符转义_2500字 字符串专题总结
  13. 7. Reverse Integer(反转整数)
  14. Linux——系统开关机指令简单学习笔记
  15. office另存为pdf的加载项_你可能需要用到的office转换技巧
  16. 查看 chrome 浏览器中的 Headers
  17. C2. Pokémon Army (hard version)
  18. STM32MP157A-DK1 烧写系统
  19. Python Revisited Day 03 (组合数据类型)
  20. 2022-2月股票投资实战------江苏国信

热门文章

  1. CTF Misc 工具
  2. Console方式下俩台思科路由器间局域网通信配置
  3. 万能的pdf转化器?
  4. 服务器并发量之突破C10K的问题
  5. x的根号下三次方用C++怎么打
  6. 原来“卧槽泥马”是成语来的,我孤陋寡闻了
  7. Python Dash(二)
  8. 浅谈产业数字化转型与产业升级
  9. 《庄子·外篇·知北游第二十二》
  10. 新概念三英语学习Unit1