Object
- Object是所有类的父类。
- Object没有父类。
- 一个类只能有一个父类。
- 如果一个类没有显示的用extends去继承一个类,那么默认其继承的是Object。
类概述
普通类
变量
- 实例变量(创建对象后,使用 对象.变量名 调用)
- 静态变量(用static修饰,使用 类名.变量名 调用)
函数
- 实例函数(创建对象后,使用 对象.函数名 调用)
- 静态函数(用static修饰,使用 类名.函数名 调用)
构造函数
- 默认构造函数
- 自定义构造函数
- 静态构造函数(使用const修饰的构造函数)
- 重定向构造函数
- 工厂构造函数
抽象类
变量
- 实例变量(其子类创建对象后,使用 对象.变量名 调用)
- 静态变量(用static修饰,使用 类名.变量名 调用)
函数
- 实例函数(其子类创建对象后,使用 对象.函数名 调用)
- 静态函数(用static修饰,使用 类名.函数名 调用)
- 抽象函数(其子类实现该函数,创建对象后,使用对象.函数名
调用)
不能实例化(工厂构造函数除外)。
普通类
声明
1 | class Class01{ |
创建类的实例,使用new
或const,new对应的是普通的构造函数,const对应的是用const形式的构造函数。
1 | var class01 = new Class01(); |
调用实例的属性或函数,使用 . 号
1 | print(class01.c); |
级联操作符 .. , 可以连续调用对象的一些列属性或函数。
1 | var class02 = new Class01(); |
构造函数:
- 没有返回值(factory构造方法有返回值)
- 构造函数名与类名相同
默认构造函数,如果类中没有显示声明构造函数,那么会默认有个构造函数,默认构造函数是与类同名且无参数无返回值的函数。
1 | class Class01{ |
所以这个类默认有个构造函数
1 | Class01(){} |
所以可以使用 new Class01() 来创建实例。
自定义构造函数
1 | class Class02{ |
如果构造函数中的参数都是给实例变量赋值的,那么上面这种情况还可以写成下面这种方式,简化了:
1 | class Class02{ |
命名构造函数,一种可以为类声明多个构造函数的方式。注意这里没有重载的概念,不能声明只是参数类型或数量不同的构造函数,使用命名构造函数实现。
1 | class Class03{ |
静态构造函数
- 类的对象不会改变
- 类的变量不会改变,也就是常量了
- 使用final修饰变量
- 使用const 修饰构造方法
- 创建实例时,使用const 而不是new
1 | class Class04{ |
重定向构造函数,在类的构造函数中,有时我们只是需要调用到另一个构造函数。
1 | class Class05{ |
工厂构造函数
- 使用factory修饰构造函数
- 构造函数内有返回值,类型是当前类或其子类,此返回值可以是用命名构造函数创建的,也可以是缓存中的。
- 使用new创建实例
1 | class Class06{ |
set get方法
- 使用 set get修饰属性
- 该属性不是真实存在,而是类似于一个函数,该函数内可以对类的其他属性和方法进行操作。
- 读取该属性值时 调用的get
- 对该属性赋值时,调用的set
1 | class Class08{ |
抽象类
- 使用abstract修饰类。
- 可定义实例方法。
- 可定义抽象方法,抽象方法没有函数体。
- 抽象类不能实例化(工厂构造函数除外)。
- 子类继承抽象类后,必须实现所有抽象方法,除非子类也是抽象类。
- 只有抽象类能定义抽象方法。
1 | //定义抽象类 |
静态变量和静态函数
- 使用static修饰的变量为静态变量。
- 使用static修饰的函数为静态函数。
- 静态变量和函数,使用类名直接调用。
- 实例变量和函数,使用类的对象调用。
- 静态变量和函数,不能访问实例变量和函数。
- 静态函数内,不能使用this。
- 普通类和抽象类都可以定义静态变量和函数
1 | class Class11{ |
枚举
- 使用enum声明枚举。
- 每个枚举值都有一个唯一值。
- 枚举不能使用new实例化 。
- 使用枚举值 枚举.枚举值。
1 | //定义枚举 |
继承
- 使用extends 关键字表示继承。
- 构造方法不能被继承。
- 使用@override重写函数。
- 如果继承的是抽象类,要实现所有抽象函数。
继承抽象类
1 | //定义抽象类 |
继承普通类
- 子类至少定义一个构造函数调用父类的任一构造函数,使用:super。
- 子类的每个构造函数都要继承父类的任一构造函数。
- 子类可重写父类的函数。
1 | class Fruit{ |
mixins
- 类在Dart中只能继承一个父类。
- mixin可理解为让类实现了继承多个父类的效果,但不是多继承,而是其目的是实现代码重用。
声明一个with类
- 跟声明普通类一样的方式。
- 区别在于,不声明构造函数,也不使用静态函数或变量。
- 纯粹的属性和函数。
怎么使用?子类声明时
- 后跟with+类名
- with后可跟多个类,用“,”分开
看个例子:
1 | class With1 { |
终极理解:
- A extends B with C,D{}
- A 继承了B
并拥有了C和D所有的属性和函数,可以用A的实例直接调用CD的属性方法。 - 如果B有函数fun1,A重写了这个函数
那么以后A的实例调用的fun1,都是A重写后的方法。 - 如果B有函数fun1,CD中也有函数fun1,A重写了这个函数
那么以后A的实例调用的fun1,都是A重写后的方法。 - 如果B有函数fun1,CD中也有函数fun1,A没有重写这个函数
那么以后A的实例调用的fun1,是声明方法时最后的那个类的函数,比如“A
extends B with C,D”,那么就是D中的fun1,如果是“A extends B with
D,C”,那么就是C中的fun1。也就是说优先级是从后向前的(前提是子类没有重写函数)。
隐式接口
- 与java不同,dart中没有专门定义接口的方式,dart中类即是接口。
- 一个类可以实现多个接口,也就是可以实现多个类,用implements。
- 一个类只能继承一个类,用extends。
1 | class X { |
- Z 实现了类X Y ,那么Z中必须重写XY中所有的属性和函数。