小菜鸡开始学习flutter之十

68 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

今日目标

今天继续学习Dart里的类,继续学习了解静态成员、操作符、类的继承这些概念

静态成员

Dart中的静态成员: 1.使用static关键字来实现类级别的变量和函数
2.静态方法不能访问非静态成员,非静态方法可以访问静态成员

静态属性和静态方法可以直接通过类来访问,而不是通过类的实例访问

class Person {
  static String name='你太有才了';
  static void sayHello(){
    print('$name---hello');
  }
}

print(Person.name);
Person.sayHello();

image.png 如上所示我们就定义了静态的属性和方法,并且通过类名直接调用。

class Person {
  static String name='你太有才了';
  int like=100;
  static void sayHello(){
    print('$name---hello');
  }
  void showLike(){ // 非静态方法可以访问静态和非静态的成员
    print('$name  的like数量为: $like'); 
    print(name);
    print(this.like); // 建议非静态成员通过this访问
    sayHello();
  }
}

void main() {
  print(Person.name);
  Person.sayHello();
  var p1 = new Person();
  p1.showLike();
}

image.png 如上就是在非静态方法里访问静态成员和非静态成员

对象操作符

Dart中的对象操作符:
? 条件运算符
as 类型转换
is 类型判断
.. 级联操作\

?

class Person{
    sayhello(){
        print('hello');
    }
}

Person p1;
p1?.sayhello();

我们定义了一个Person类型的变量p1没有赋值,这个时候如果直接调用p1.sayhello()方法是会报错的,通过?操作符,可以判断p1上是否有对应的成员,没有就不会执行,也不会阻碍程序往下执行。

is&as

is 类型判断

class Person{
    
}
Person p = new Person();
if (p is Person) {
    print('p是Person类型');
}

image.png 如上就是通过is来判断新创建的变量p是否属于Person这个类型,要注意所有的对象都是Object类型的拓展

as 类型转换

var p1;
p1='';
p1 = new Person();
p1.sayhello();

在以前的老版本中,向上面这样的写法是会报错的。因为不能解析到变量p1到底是什么类型,在新版的dart中这样写是可以的。这是我们就可以用上as这个关键字来转换类型

(p1 as Person).sayhello();

.. 级联操作

我们之前去修改一个属性的值或者调用一个方法都是一个个的去操作的,通过 .. 级联操作符可以让我们将这些操作连贯起立

Person p1 = new Person();
p1..name='你太有才了2'
  ..like=1000
  ..sayhello();

相当于我们在js中的链式调用。

继承

Dart中类的继承:
1.子类使用extends关键字来继承父类
2.子类会继承父类里面可见的属性和方法,但是不会继承构造函数
3.子类可以复写父类的方法 getter和setter

class Person{
    var name;
    var like;
    Person(this.name, this.like);
    void sayhello(){
        print('$name---$like---hello');
    }
}

class Student extends Person{
    Student(String name, num like) : super(name, like){}
}

Student s = new Student('你太有才了', 100);
s.sayhello();

image.png 如上我们不但使用到了extends关键字来继承Person,还通过super来给父类的构造函数传参。
在Student里我们还可以定义新的属性和方法。

class Person{
    Person.hello(String text){
        print(text);
    }
}

class Student extends Person {
    Student(String text) : super.hello(text) {}
}

同样的我们也可以通过super来给父类的命名函数传参

class Person{
    hello(){
        print('hello person');
    }
}

class Student extends Person {
   @override
   hello(){
       print('hello student');
   }
}

image.png 像上面这样,我们也可以复写父类的方法。最好在复写的方法上增加 @override 关键字
在子类的方法里想要调用父类的方法也是可以的,通过super.父类的方法名来调用

class Student extends Person{
    hh(){
        super.hello();
    }
}

ending

持续学习,加油,如有不对的地方还请指正,谢谢~~