Dart 语言学习 06
Author : ScorpioDong
1. 类
Dart是一种面向对象的语言。它支持面向对象的编程功能,如类,接口等。OOP方面的类是创建对象的蓝图/模板。类封装了对象的数据。Dart为类概念提供了内置支持。
1.1 类的声明
- 使用
class
关键字在Dart中声明一个类。 - 类定义以关键字
class
开头,后跟类名。 - 类名建议使用大驼峰命名法。
- 类名后跟一对大括号包裹的类体。
class Test {
// Fields
String name;
// Getters and Setters
// Constructors
Test() {
this.name = "张三";
}
// Functions
void eat() {
print("$name eatting...");
}
}
类体中的Fields、Getters and Setters、 Constructors和Functions都是可选的,按需定义
- 字段(fields) - 字段是类中声明的任何变量,字段表示与对象有关的数据。
- setters和getters - 允许程序初始化和检索类字段的值,默认的getter/setter与每个类相关联。但是可以通过显式定义setter/getter来覆盖默认值。
- 构造函数(constructors) - 负责为类的对象分配内存。
- 函数(functions) - 函数表示对象可以采取的操作,它们有时也称为方法。
1.2 类的实例和属性函数访问
使用new
关键字后跟类名创建类的实例。
main() {
var obj = new Test();
print(obj.name);
obj.eat();
}
class Test {
// Fields
String name;
// Getters and Setters
// Constructors
Test() {
this.name = "张三";
}
// Functions
void eat() {
print("$name eatting...");
}
}
通过类的实例化对象访问类的属性和方法。使用.
点来访问累的数据成员。
1.3 构造函数
- 构造函数是类的特殊函数,负责初始化类的变量。
- Dart中的构造函数是与类名相同的函数。
- 构造函数可以存在形参。构造函数没有返回值。
- 如果未显示提供构造函数,Dart默认提供一个无参的空构造函数。
class Test {
// Fields
String name;
// Getters and Setters
// Constructors
Test() { // <--构造函数,初始化了name变量
this.name = "张三";
}
// Functions
void eat() {
print("$name eatting...");
}
}
Dart提供了命名构造函数,使类可以定义多个构造函数。
语法 类名.构造方法名(形参列表) {函数体}
class Test {
// Fields
String name;
// Getters and Setters
// Constructors
// 构造函数,初始化了name变量
Test() {
this.name = "张三";
}
// 命名构造函数
Test.nameTest(String name) {
this.name = name;
}
// Functions
void eat() {
print("$name eatting...");
}
}
1.4 this关键字
this关键字引用类的当前实例。这里,参数名称和类字段的名称是相同的。因此,为了避免歧义,类的字段以this关键字为前缀。
class Test {
// Fields
String name;
// Getters and Setters
// Constructors
// 构造函数,初始化了name变量
Test() {
this.name = "张三"; // this关键字的使用
}
// 命名构造函数
Test.nameTest(String name) {
// this关键字的使用,因为字段名和形参名一样,冲突
this.name = name;
}
// Functions
void eat() {
print("$name eatting...");
}
}
1.5 Getter and Setter
Getters和Setter(也称为访问器和更改器)允许程序分别初始化和检索类字段的值。使用get关键字定义getter或访问器。Setter或存取器是使用set关键字定义的。
默认的getter/setter与每个类相关联。但是,可以通过显式定义setter/getter来覆盖默认值。getter没有参数并返回一个值,setter只有一个参数但不返回值。
main(List<String> args) {
var a = new Test();
a.test_name = "李四";
print(a.test_name);
}
class Test {
// Fields
String name;
// Getters and Setters
// 定义name 的 Getter
String get test_name {
return name;
}
// 定义name 的 Setter
void set test_name(String name) {
this.name = name;
}
// Constructors
// 构造函数,初始化了name变量
Test() {
this.name = "张三"; // this关键字的使用
}
// 命名构造函数
Test.nameTest(String name) {
// this关键字的使用,因为字段名和形参名一样,冲突
this.name = name;
}
// Functions
void eat() {
print("$name eatting...");
}
}
1.6 封装
- Dart没有private、public等权限修饰符。
- 可以使用
_
下划线为标识符添加前缀,标记为私有。
class Test {
// Fields
String _name; //标记私有外部无法访问
// Getters and Setters
// 定义name 的 Getter
String get test_name {
return _name;
}
// 定义name 的 Setter
void set test_name(String name) {
this._name = name;
}
// Constructors
// 构造函数,初始化了name变量
Test() {
this._name = "张三"; // this关键字的使用
}
// 命名构造函数
Test.nameTest(String name) {
// this关键字的使用,因为字段名和形参名一样,冲突
this._name = name;
}
// Functions
void eat() {
print("$_name eatting...");
}
}
1.7 继承
- Dart支持继承的概念,它是程序从现有类创建新类的能力。扩展为创建较新类的类称为父类/超类。新创建的类称为子/子类。
- 一个类使用
extends
关键字从另一个类继承。子类继承除父类的构造函数之外的所有属性和方法。 - Dart的类只支持单继承模式,也就是一个类只能有一个父类。
main(List<String> args) {
var obj = new B();
print(obj.a);
}
class A {
int a = 5;
}
class B extends A {
}
执行
5
方法重写
- 方法重写是子类在其父类中重新定义方法的机制。
- 重写方法使用
@override
标记。 - 重写方法与父类方法的方法名,形参列表和返回值类型都要一致。
main(List<String> args) {
var obj = new B();
obj.F();
}
class A {
int a = 5;
F() {
print("123");
}
}
class B extends A {
@override
F() {
print("456");
}
}
执行
456