前言
面向对象编程(OOP)的三个基本特征是:封装、继承、多态
dart中所有的东西都是对象,所有的对象都继承自object类
dart是一门使用类和单向继承的面向对象语言,所有对象都是类的实例。并且所有的类都是object的子类
一个类通常由属性和方法组成
创建类使用类
class Person {
String name = "zhangsan";
int age = 23;
void getInfo() {
print('${this.name}-----${this.age}');
}
void setInfo(int age) {
this.age = age;
}
}
main() {
var p1 = new Person();
print(p1.name);
p1.setInfo(28);
p1.getInfo();
}
构造函数
自定义类的默认构造函数
class Person {
String name;
int age;
// 默认构造函数
Person(String name, int age) {
print('这是构造函数里面的内容 这个方法在实例化的时候触发');
this.name = name;
this.age = age;
}
void getInfo() {
print('${this.name}-----${this.age}');
}
}
main() {
var p1 = new Person('hhh', 23);
}
默认构造函数的简写
class Person {
String name;
int age;
// 默认构造函数的简写 //此处又修改
Person(this.name, this.age);
void getInfo() {
print('${this.name}-----${this.age}');
}
}
main() {
var p1 = new Person('hhh', 23);
}
命名构造函数
实例化DateTime调用它的命名构造函数
main(List<String> args) {
var d = new DateTime.now();
}
定义命名函数
class Person {
String name;
int age;
// 默认构造函数的简写
Person(this.name, this.age);
Person.now() {
print('我是命名构造函数');
}
// 可以定义多个命名函数
Person.setInfo(String name, int age) {
print('我是命名构造函数');
this.name = name;
this.age = age;
}
}
main() {
// var p1 = new Person('hhh', 23);// 默认实例化类是调用的是默认构造函数
// var p1 = new Person.now();
var p1 = new Person.setInfo('hhh', 23);
}
私有方法 和私有属性
dart 和其他面向对象语言不一样,data中没有public,private,protected这些访问修饰符,但我们可以使用_把一个属性或者方法定义为私有。
抽离出来成为一个模块时,_name,_run直接访问不到
class Person {
String _name;
int age;
// 默认构造函数的简写
Person(this._name, this.age);
void printInfo() {
print("${this._name}----${this.age}");
}
// 访问私有属性的方法
String getName() {
return this._name;
}
// 私有方法
void _run() {
print("${this._name}----${this.age}");
}
// 调用私有方法
execRun() {
this._run();
}
}
可以通过 getName 、execRun方法访问。
main() {
var p1 = new Person('hhh', 23);
print(p1._name); //报错 没办法直接访问
print(p1.getName());
p1.execRun();
}
类中的getter和setter修饰符
class Rect {
num height;
num width;
Rect(this.height, this.width);
area() {
return this.height * this.width;
}
get area1 {
return this.height * this.width;
}
set areaHeight(v) {
return this.height = v;
}
}
main() {
Rect r = new Rect(10, 4);
print('面积:${r.area()}');
// 访问set的方法
r.areaHeight = 6;
// 访问get的方法
print('面积:${r.area1}'); //注意调用直接通过访问的属性方式访问area1
}
类中的初始化列表
dart中我们也可以在构造函数体运行之前初始化实例变量
class Rect {
num height;
num width;
Rect()
: height = 2,
width = 10 {
print("${this.height}---${this.width}");
}
area() {
return this.height * this.width;
}
}
类中的静态成员 静态方法
- 使用static关键字来实现类级别的变量和函数
class Person {
static String name = '张三';
static void show() {
print(name);
}
}
main() {
print(Person.name);
Person.show();
}
- 静态方法不能访问非静态成员。非静态方法可以访问静态成员。
class Person {
static String name = '张三';
int age = 29;
static void show() {
print(name);
}
void printInfo() {
//非静态方法可以访问静态成员
print(name); //访问静态属性
print(this.age); //访问非静态属性
show(); //调用静态方法
}
static void printInfo2() {
//静态方法不能访问非静态成员
print(name); //访问静态属性
show(); //调用静态方法
// print(this.age); //报错 不能访问非静态属性
}
}
main() {
// Person p = new Person();
// p.printInfo();
Person.printInfo2();
}
对象操作符
class Person {
String name;
int age;
Person(this.name, this.age);
void printInfo() {
print(name);
}
}
- ? 条件运算符
Person p;
p?.printInfo();
Person p1 = new Person('hhh', 20);
p1?.printInfo();
- is 类型判断
Person p2 = new Person('hhh', 20);
if (p2 is Person) {
print('p2 是Person类');
}
- as 类型转换
var p3;
p3 = '';
p3 = new Person('hhh', 20);
(p3 as Person).printInfo();
- .. 级联操作
可以将以下代码简化
Person p4 = new Person('hhh', 23);
p4.printInfo();
p4.name = 'hhh2';
p4.age = 22;
p4.printInfo();
简化为:
p1..name = 'hhh3'
..age = 30
..printInfo();
网友评论