Dart中的静态成员:
- 使用static关键字来定义静态属性或者静态方法;
- 静态属性或静态方法使用类名直接访问(无法使用实例化的对象去访问);
- 静态方法只能访问静态方法和静态属性,不能访问非静态属性和非静态方法,非静态方法既可以访问静态属性和静态方法,也可以访问非静态属性和非静态方法;
- 非静态方法访问静态属性或方法时直接用属性或方法名,不能使用this.(访问非静态属性或方法时推荐使用this.)。
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);
}
// 非静态方法
void printInfo(){ // 非静态方法可以访问静态成员以及非静态成员
print(name); // 访问静态属性
print(this.age); // 访问非静态属性
show(); // 调用静态方法
}
// 静态方法
static void printUserInfo(){
print(name); // 静态属性
show(); // 静态方法
// print(this.age); // 静态方法没法访问非静态的属性
// this.printInfo(); // 静态方法没法访问非静态的方法
// printInfo();
}
}
main(){
print(Person.name);
Person.show();
Person p = Person();
p.printInfo();
Person.printUserInfo();
}
Dart中的对象操作符:
? 条件运算符 (了解)
as 类型转换
is 类型判断
.. 级联操作 (连缀) (记住)
// 定义一个Person类
class Person {
String name;
num age;
// 默认构造函数
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
main(){
// ? - 条件运算符
Person p;
p.printInfo(); // 报错
p?.printInfo(); // 不会打印任何内容
Person p = Person('张三', 20);
p?.printInfo(); // 张三---20
// is - 类型判断
Person p = Person('张三', 20);
if(p is Person){
p.name = "李四";
}
p.printInfo(); // 李四---20
print(p is Object); // true
// as - 类型转换
var p1;
p1 = '';
p1 = Person('张三1', 20);
p1.printInfo(); // 老版本会报错,老版本中需要使用as进行类型转换
(p1 as Person).printInfo();
// 普通赋值方式
Person p1 = Person('张三1', 20);
p1.printInfo();
p1.name = '张三222';
p1.age = 40;
p1.printInfo(); // 张三222---40
// 使用级联操作
Person p2 = Person('张三1', 20);
p2..name = "李四"
..age = 30
..printInfo();
}
面向对象的三大特性:封装 、继承、多态
Dart中的类的继承:
- 子类使用extends关键词来继承父类;
- 子类会继承父类里面可见的属性和方法,但是不会继承构造函数;
- 子类能复写父类的方法(getter和setter)。
简单继承
class Person {
String name = '张三';
num age = 20;
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Student extends Person{
}
main(){
Student s = Student();
print(s.name);
s.printInfo();
}
super关键词的使用
class Person {
String name;
int age;
Person(this.name, this.age);
// Person.test(this.name, this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Student extends Person{
// 扩展自己的属性
String sex;
// super 给默认构造函数传参
Student(String name, int age, this.sex) : super(name, age);
// super.test 给命名构造函数传参
// Student(String name, int age, this.sex) : super.test(name, age);
// 扩展自己的方法
void run() {
print("${this.name}---${this.age}---${this.sex}");
}
}
main(){
Student s = Student("张三",20,"男");
w.printInfo(); // 张三---20
w.run(); // 张三---20---男
}
覆写父类的方法
class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
work(){
print("${this.name}在工作...");
}
}
class Student extends Person{
Student(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(){
Student s = Student('李四',20);
s.printInfo(); // 姓名:李四---年龄:20
s.work(); // 李四的工作是写代码
}
子类里面调用父类的方法
class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
work(){
print("${this.name}在工作...");
}
}
class Student extends Person{
Student(String name, num age) : super(name, age);
run(){
print('run');
super.work(); //自类调用父类的方法
}
//覆写父类的方法
@override //可以写也可以不写 建议在覆写父类方法的时候加上 @override
void printInfo(){
print("姓名:${this.name}---年龄:${this.age}");
}
}
main(){
Student s = Student('李四',20);
s.printInfo(); // 姓名:李四---年龄:20
s.run(); // run 李四在工作...
}