Dart-类、静态成员、操作符、类的继承

275 阅读3分钟

Dart中的静态成员:

  1. 使用static关键字来定义静态属性或者静态方法;
  2. 静态属性或静态方法使用类名直接访问(无法使用实例化的对象去访问);
  3. 静态方法只能访问静态方法和静态属性,不能访问非静态属性和非静态方法,非静态方法既可以访问静态属性和静态方法,也可以访问非静态属性和非静态方法;
  4. 非静态方法访问静态属性或方法时直接用属性或方法名,不能使用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中的类的继承:
  1. 子类使用extends关键词来继承父类;
  2. 子类会继承父类里面可见的属性和方法,但是不会继承构造函数;
  3. 子类能复写父类的方法(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 李四在工作...
}