静态成员
- 使用static 关键字来实现类级别的变量和函数
- 静态方法不能访问非静态成员,非静态方法可以访问静态成员
class Person {
static String name = '张三';
static void show() {
print(name);
}
}
main() {
print(Person.name); // 张三
Person.show(); // 张三
}
class Person {
static String name = '张三’; // 静态属性
int age = 20;
// 静态方法
static void show() {
print(name);
}
// 静态方法
static void printUserInfo() {
print(name); // 静态属性
show(); // 静态方法
// print(this.age); //静态方法没法访问非静态的属性
// this.printInfo(); //静态方法没法访问非静态的方法
// printInfo();
}
void printInfo() {
/*非静态方法可以访问静态成员以及非静态成员*/
print(name); // 访问静态属性
print(this.age); // 访问非静态属性
show(); //调用静态方法
}
}
main() {
print(Person.name);
Person.show();
Person p = new Person();
p.printInfo();
Person.printUserInfo();
}
Dart中的对象操作符
- ? 条件运算符
- as 类型转换
- is 类型判断
- .. 级联操作 (连缀)
class Person {
String name;
num age;
Person(this.name, this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
main() {
// Person p;
// p?.printInfo(); // person未实例化,不存在printInfo()方法,所以未打印
Person p = new Person('张三', 20);
p?.printInfo();
// is的用法
Person p = new Person('张三', 20);
if (p is Person) {
p.name = "李四";
}
p.printInfo();
print(p is Object);
// as的用法
var p1;
p1 = '';
p1 = new Person('张三1', 20);
// p1.printInfo(); // 老版本会有问题
(p1 as Person).printInfo();
// 重新赋值
Person p1 = new Person('张三1', 20);
p1.printInfo();
p1.name = '张三222';
p1.age = 40;
p1.printInfo();
// 级联操作
Person p1 = new Person('张三1', 20);
p1.printInfo();
p1..name = "李四"
..age = 30
..printInfo();
}
面向对象的三大特性:封装 、继承、多态
Dart中的类的继承
- 子类使用extends关键词来继承父类
- 子类会继承父类里面可见的属性和方法 但是不会继承构造函数
- 子类能复写父类的方法 getter和setter
class Person {
String name = '张三';
num age = 20;
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Web extends Person {}
main() {
Web w = new Web();
print(w.name); // 张三
w.printInfo(); // 张三---20
}
Dart 类的继承 super关键词
- Dart 类的继承 super关键词的使用 实例化自类给父类构造函数传参
class Person {
String name;
num age;
Person(this.name, this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Web extends Person {
Web(String name, num age) : super(name, age) {}
}
main() {
Person p = new Person('李四', 20);
p.printInfo(); // 李四---20
Web w = new Web('张三', 12);
w.printInfo(); // 张三---12
}
继承后,实现自己的方法
class Person {
String name;
num age;
Person(this.name, this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Web extends Person {
String sex;
Web(String name, num age, String sex) : super(name, age) {
this.sex = sex;
}
run() {
print("${this.name}---${this.age}--${this.sex}");
}
}
main() {
Web w = new Web('张三', 12, "男");
w.printInfo();
w.run();
}
实例化自定义构造函数
class Person {
String name;
num age;
Person(this.name, this.age);
Person.xxx(this.name, this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Web extends Person {
String sex;
Web(String name, num age, String sex) : super.xxx(name, age) {
this.sex = sex;
}
run() {
print("${this.name}---${this.age}--${this.sex}");
}
}
main() {
Web w = new Web('张三', 12, "男");
w.printInfo();
w.run();
}
覆写父类的方法,一般要加 @override 标识覆写方法
class Person {
String name;
num age;
Person(this.name, this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
work() {
print("${this.name}在工作...");
}
}
class Web extends Person {
Web(String name, num age) : super(name, age);
run() {
print('run');
}
// 覆写父类的方法
@override // 可以写也可以不写 建议在覆写父类方法的时候加上 @override
void printInfo() {
print("姓名:${this.name}---年龄:${this.age}");
}
@override
work() {
print("${this.name}的工作是写代码");
}
}
main() {
Web w = new Web('李四', 20);
w.printInfo();
w.work();
}
子类中调用父类方法;
class Person {
String name;
num age;
Person(this.name, this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
work() {
print("${this.name}在工作...");
}
}
class Web extends Person {
Web(String name, num age) : super(name, age);
run() {
print('run');
super.work(); // 自类调用父类的方法
}
@override // 覆写父类的方法
void printInfo() {
print("姓名:${this.name}---年龄:${this.age}");
}
}
main() {
Web w = new Web('李四', 20);
w.printInfo();
w.run();
}
Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.https://serious-lose.notion.site/Dart-10-Day-2c7e2133210b47749e29e85d1fea35e2