《越空Dart教程》:第七节 类
自我介绍
大家好,我是越空,一位货真价实的16岁开发者。由于最近我在学习Dart这门语言,所以我就想总结我所学到的知识,分享给大家,让大家和我一起学习这门语言,争取做到可以让大家真的也学习到东西,并且少走一些弯路,感谢大家的支持。
这是我发表的第一套教程,多多少少会有不足的地方,还请大家多多见谅,有什么问题或者建议,也可以发表评论和私信我,希望可以得到大家的支持,我会再接再厉的!
那么接下来,我们正式开始今天的学习吧!
这是一套系列课程,新来的读者请从第一节开始学习
在上一节我们已经学完了Dart中的函数。
本节课我们将学习Dart中的类,有类的使用、构造函数、私有方法和属性(类中的getter和setter修饰符的用法)、静态成员、操作符、类的继承六部分。
第一部分:类的使用
类的介绍
Dart是一门面向对象的编程语言。面向对象有三个基本特征:封装、继承、多态。Dart所有的东西都是对象,所有的对象都继承自Object类。
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。
一个类通常由属性和方法组成。
Data内置对象
类 Class 我们其实已经很熟悉了 ,我们常用的数据结构 List、Map类型,都属于Class。
类的创建
注意:规范的类名以大写字母开头、方法名以小写字母开头
类的使用
运行结果,
把类单独抽离成一个模块
在我们真正写项目的时候 会有很多个类,可能几十个 几百个,或者更多,我们不可能把这所有的类全都放进一个文件里,这样项目的可维护性会非常的差、不易维护。
我们通常会把一个类或者和其相关的类抽离到单独的一个模块中,用到的时候导入一下即可。
首先我们将要抽离的类的全部代码剪贴下来,然后新建一个.dart的文件 将代码贴上去,将其保存到一个文件夹下 ,
Student.dart的内容,
再在同文件夹下新建一个hello.dart文件,在hello.dart中导入Student.dart,使用Student类,
把类单独抽离成一个模块的好处:模块化、可以实现多人开发。
第二部分:构造函数
默认构造函数
构造函数在类实例化的时候触发调用。构造函数的格式:
类名(){
方法体
}
其实,每一个类都有构造方法。在实例化它的时候都会触发调用它的构造方法,没有自定义构造方法的时候,就如下图的Student类,
在没有自定义构造方法的时候,它都有一个默认的构造方法。比如上图的这个Student类。完整的其实是这样的,
在没有自定义构造函数的时候,都会有一个默认的空的构造函数,然后在实例化这个类的时候,就会触发它。
自定义默认构造函数
例子:给Student类增加一个构造函数。
然后在main函数中去实例化它,看看运行结果,
既然是函数 当然就可以有参数 在触发调用的时候去传入参数。之前getInfo和setInfo函数的功能 就都可以使用构造函数实现了,如下,
实例化调用时传入参数,运行结果,
定义构造函数的时候,可以这样简写,
这样写 就直接将参数赋值给类中的this属性,就不用一行一行的去写赋值语句了。如果不要下面的输出,只是实现设置属性的功能的话,还可以简写成这样,
就一行语句。
命名构造函数
一个类只能有一个默认构造函数,但是却可以有无数个命名构造函数,命名构造函数就是使用名字去触发调用的构造函数。
命名构造函数的格式:
类名.命名{
方法体
}
实例化,运行结果,
构造函数体运行前初始化列表
可以在构造函数体运行前去初始化属性。
第三部分:私有方法和属性
私有方法和属性
Dart和其他面向对象语言不一样,Data中没有 public private protected这些访问修饰符合。
Dart中可以使用_来将类中的方法或者属性设置为私有。
不加_的方法和属性默认是公开的,也就是外部可以访问的,例如Person类中有一个getInfo方法,在外部将Person实例化 是可以使用getInfo方法的,可是如果将getInfo设置成私有方法,在外部就是无法访问的了,只能在内部自己进行使用。
这个外部的定义是当前这个.dart文件之外的文件,如果是在同一个文件下,就算将属性或者方法设置为私有,在其他地方 例如main方法 将其实例化之后依旧是可以访问使用私有属性和方法的。只要在同一个文件内 都属于是内部。
演示,新建两个文件temporary.dart和test.dart,
注:两个文件要在同一个文件夹下
temporary.dart
test.dart
getter和setter
get是一个计算属性,将函数体内计算的结果赋值给get属性。
注意:
get没有() 参数列表
set只能有一个形参
第四部分:静态成员
静态成员和静态方法
在Dart中,类里面可以有静态成员(方法或者属性),使用static 关键字来定义静态成员。
静态成员是独立于类中的,不关联上下文。在使用的时候无需实例化类,直接通过类名.变量名来使用。
注意:因为静态成员是不关联上下文的,所以静态方法不能访问非静态成员,非静态方法可以访问静态成员。
演示,
第五部分:对象操作符
? 条件运算符
例如如下这种情况,
运行代码之后报错了,因为并没有给变量p进行实例化的赋值,只是声明了它的类型。像这种情况p就是空数据,所以怎么可能会有属性或者方法呢。
就需要用到?操作符,来检测变量p是否为空,如果是空就不进行后面的操作 不操作name属性。所以输出的结果是空。
as 类型转换
这个并不是像第三节中讲到的类型转换,如String转num num转String。而是可以使用as将子类转换为父类,例如有一个类Person,又有一个类Student,然后Student继承于Person类 是Person类的子类,就可以使用as将Student转换成父类Person 然后使用Person的方法。
例子演示,
is 类型判断
之前在第三节就讲过is类型判断了,忘记的可以去翻看第三节的内容。我们这节讲的是类,自然就是和类有关的操作。
在上文中说到过Dart是一门面向对象的编程语言。Dart所有的东西都是对象,所有的对象都继承自Object类。,所有的类都是Object的子类。
既然说所有的类型都是Object的子类,那我们学会了使用is,就用is来测试一下。
测试成功,所有的类型都是Object。
… 级联操作
我们看这样一个类,
在main函数中实例化之后,按照我们目前所学的知识,想去使用它这样操作,
三行语句,分别去设置name属性、设置age属性、调用printInfo函数。使用级联操作可以一步到位,
第六部分:类的继承
类的继承
有一个表示人的类型 Person,有三个属性 姓名、性别、年龄。
我们要再建立一个表示学生的类型 Student,就可以直接继承自Person类,因为学生也是人,也有姓名、性别和年龄的属性,只是在此基础上新增一个学号的属性。
继承使用extends关键字操作。继承一个类之后就属于其类的子类,被继承的类就是子类的父类。子类继承父类所有的公开的属性和方法,包括set和get,也可以重写父类的方法、set和get。
super关键词的使用
给父类构造函数传参![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/224ad2e13aae8b5dc7f49d64ce29a69a.png#pic_center)
给父类命名构造函数传参![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e29f0756c3dc36054dd17c5e36c20991.png#pic_center)
子类调用父类的方法![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/29ba1b08ab5b9b617f373f570d7bae56.png#pic_center)
覆写父类的方法
完全重写
不完全重写![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/716c64a8b82753534acc9cafa7cd2575.png#pic_center)
结束
好了,这节讲了类的使用、构造函数、私有方法和属性(类中的getter和setter修饰符的用法)、静态成员、操作符、类的继承六大部分,希望对你有帮助。
下节预告
讲解Dart中的抽象类、多态、接口、和Mixins。
好了,这节就分享这么多了,我们下节再见,祝大家编程愉快!!