对象_类
对象/类
对象_类
对象/类
面向对象编程(OOP)的三个基本特征:封装、继承、多态
- 封装:封装是对象和类概念的主要特性;封装 把客观事物封装成抽象的类,并且把自己的部分属性和方法提供其它
- 继承:面向对象编程语言的一个
- 多态:
Dart所有的东西都是对象,所有的对象都继承自Object类。
Dart是一门使用类和单继承的面相对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类
一个类通常由属性和方法组成。
创建类 使用类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 首字母大写
class Person {
String name = '张三';
int age = 20;
void getInfo() {
print('$name,$age');
print('${this.name},${this.age}'); // 推荐
}
void setInfo(int age) {
this.age = age;
}
}
void main() {
var p = new Person();
print(p.name); // 张三
p.getInfo();
p.setInfo(28); // 张三,20
p.getInfo(); // 张三,28
}
构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Person {
String name = '张三';
int age = 20;
// 默认构造函数
Person() {
print('这是构造函数里面的内容 这个方法是在实例化的时候触发');
}
void getInfo() {
print('$name,$age');
print('${this.name},${this.age}');
}
}
void main() {
var p = new Person();
}
构造函数传参
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
String name = '';
int age = 20;
// 默认构造函数
Person(String name, int age) {
this.name = name;
this.age = age;
}
void getInfo() {
print('${this.name},${this.age}');
}
}
void main() {
Person p = new Person('张三', 28);
p.getInfo(); // 张三,28
}
默认构造函数**简写**
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person {
String name = '';
int age = 20;
// 默认构造函数 - 简化写法
Person(this.name, this.age);
void getInfo() {
print('${this.name},${this.age}');
}
}
void main() {
Person p = new Person('张三', 28);
p.getInfo(); // 张三,28
}
命名构造函数
1
2
3
4
void main() {
// 实例话 DateTime 调用它的命名构造函数
var d = new DateTime.now();
}
Dart 里命名构造函数可以写多个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Person {
String name = '';
int age = 20;
// 默认构造函数 - 简化写法
Person(this.name, this.age);
// 命名构造函数
Person.now() {
print('我是命名构造函数');
}
// 命名构造函数
Person.setInfo(String name, int age) {
this.name = name;
this.age =age;
}
void getInfo() {
print('${this.name},${this.age}');
}
}
void main() {
Person p1 = new Person.now(); // 我是命名构造函数
Person p2 = new Person.setInfo('张三', 20);
p2.getInfo(); // 张三,20
}
把类单独抽离成一个模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person {
String name = '';
int age = 20;
// 默认构造函数 - 简化写法
Person(this.name, this.age);
// 命名构造函数
Person.now() {
print('我是命名构造函数');
}
// 命名构造函数
Person.setInfo(String name, int age) {
this.name = name;
this.age =age;
}
void getInfo() {
print('${this.name},${this.age}');
}
}
引入
1
2
3
4
5
6
7
8
9
// 引入
import 'Person.dart';
void main() {
// 使用
Person p1 = new Person.now();
Person p2 = new Person.setInfo('张三', 20);
p2.getInfo();
}
私有属性
定义:使用 _ 把一个属性或者方法定义成私有的
必须是在一个单独的模块中才会生效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
String name = '';
int _age = 20; // 私有属性
// 默认构造函数 - 简化写法
Person(this.name, this._age);
void getInfo() {
return this._age;
}
void _run() {
print('这是一个私有方法');
}
execRun() {
this._run(); // 类里面方法的相互调用
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 引入
import 'Person.dart';
void main() {
Person p = new Person('张三', 28);
// 报错 无法访问私有属性
print(p.age);
// 间接获取私有属性
print(p.getInfo()); // 28
p._run(); // 私有方法 无法访问
// 间接调用私有方法
p.execRun(); // 这是一个私有方法
}
类中的 getter 和 setter 修饰符
- getter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Rect {
num width = 0;
num height = 0;
Rect(this.width, this.height);
get area {
return this.width * this.height;
}
}
void main() {
Rect r = new Rect(10, 4);
// 注意调用 直接通过访问属性的方式访问area
var area = r.area;
print(area); // 40
}
- setter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Rect {
num width = 0;
num height = 0;
Rect(this.width, this.height);
get area {
return this.width * this.height;
}
set areaHeight(value) {
this.height = value;
}
}
void main() {
Rect r = new Rect(10, 4);
r.areaHeight = 6;
var area = r.area;
print(area); // 60
}
初始化实例变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Person {
String name = '';
int age = 20;
// 先赋值 再初始化构造函数
Person(): name = '张三', age = 28 {
}
void getInfo() {
print('${this.name},${this.age}');
}
}
void main() {
Person p = new Person();
p.getInfo(); // 张三,28
}
本文由作者按照 CC BY 4.0 进行授权