天天看点

Dart基础-类

dart是面向对象的编程语言,每一个对象是一个类的实例,所有类都源于object,创建一个对象,你可以使用 new 关键字构建一个类,构造函数的名字可以是 classname 或 classname.identifier

对象里有成员函数和数据,包括方法和实例变量,使用 . 可以引用一个实例变量或方法

使用级联操作符 .. 对一个对象成员做一系统操作

一些类提供常量的构造函数,创建编译时常量的构造函数时,使用 const 而不是 new

构建两个相同的的编译时常量

声明实例变量,所有未初始化的实例变量的值为null

所有实例变量都有隐式的getter方法,不是常量的实例变量都有隐式的setter方法

声明一个构造函数就是创建一个与类同名的函数,关键字 this 是指当前的,只有在命名冲突时有效,否则dart会忽略处理

通常一个实例变量分配一个构造函数参数,这样使语法理简单

如果你没有声明一个构造函数,默认有一个构造函数,默认构造函数没有参数,调用父类的无参构造函数

子类不能继承父类的构造函数

使用命名构造函数让类有多个构造函数

通常情况下,子类构造函数调用父类的默认构造函数,如果父类没有默认构造函数,您必须手动调用父类的构造函数,在 : 号后面指定父类的构造函数

因为父类的构造函数的参数是执行之前调用的,所以一个参数可以是一个表达式

除了调用父类的构造函数,你也可以在构造函数体运行之前初始化实例变量

有时一个构造函数的唯一目的是重定向到同类的另一个构造函数

如果一个类生成的对象永远不会改变,你可以让这些对象变成编译时常量,为此定义一个 const 构造函数并确保所有实例变量是 final 的

使用 factory 关键字实现构造函数时,不一定要创建一个类的新实例,例如,一个工厂的构造函数可能从缓存中返回一个实例,或者返回一个子类的实例

方法就是函数,提供了对象的行为

实例对象可以访问实例变量和方法

getter和setter是特殊的方法,可以读写访问一个对象的属性,每个实例变量都有一个隐式的getter,如果适当的加上一个setter,您可以通过实现getter和setter创建附加属性,使用get和set关键词

实例、getter和setter方法可以是抽象的,抽象方法使用分号 ; 而不是方法体

您可以覆盖如下所示的运算符

下面是重写 + 和 - 的例子

使用abstract修饰符定义的抽象类不能被实例化,抽象类用于定义接口,常用于实现,如果你想让抽象类可实例化,定义工厂构造函数

抽象类里通常有抽象方法

下面的类并不是抽象类,因此可以被实例化,尽管它定义了一个抽象方法

每个类都隐式定义一个接口,包含所有类和实例成员

通过声明一个类实现一个或多个接口的implements子句,然后提供所需的api接口

这是指定一个类实现多个接口的例子

使用 extends 创建一个子类,以及 super 引用父类

子类可以重写实例方法、getter和setter,下面的例子重写了nosuchmethod()方法

您可以使用 @override 注释表明你是故意重写

如果你使用nosuchmethod()来实现每一个可能的getter、setter、类方法,你可以使用 @proxy 注释来避免警告

枚举类型,通常被称为enumerations或enums,是一种特殊的类,用于表示一个固定数量的常量值,不能显式的实例化

声明一个枚举类型使用 enum 关键字

每个枚举的索引通过 index 获得,返回从零开始的位置值的枚举声明

获得枚举值的列表,枚举的索引不变

你可以在switch语句中使用枚举

混入类重用一个类的代码在多个类层次结构,使用 with 关键字后面跟着一个或多个混入类的名字

要实现混入类,创建一个类、扩展对象,声明没有构造函数,没有父类调用

使用 static 关键字实现类的变量和方法

静态变量(类变量)是类的常量

静态方法(类方法)没有实例,因此无法通过实例访问

您可以将静态方法作为编译时常量,例如,你可以将静态方法作为参数传递给一个常量的构造函数