类方法

Dart中的类方法也就是静态方法,访问的时候直接使用类去访问,不用创建实例变量。

  1. class StaticClass {
  2. // 静态
  3. static int count = 1;
  4. static int sum(int a){
  5. return a + count;
  6. }
  7. }

这里的静态方法也就相当于类方法:
image.png
在静态方法里面不能访问非静态成员:

  1. class StaticClass {
  2. // 静态
  3. static int count = 1;
  4. int currentCount = 0;
  5. static int sum(int a){
  6. return a + count + this.currentCount;
  7. }
  8. }

image.png
但是在实例方法里面可以访问非静态成员,也可以访问静态成员

  1. class StaticClass {
  2. // 静态
  3. static int count = 1;
  4. int currentCount = 0;
  5. static int sum(int a){
  6. return a + count ;
  7. }
  8. int sum1(int a) {
  9. return currentCount + a + count;
  10. }
  11. }

因为静态方法是通过类对象来调用的,类对象在调用之前实例对象还有可能没有被构造,所以成员变量也可能不存在。所以在类方法里面不能访问非静态成员。静态变量在整个内存中只有一份,只要在一处被修改,全局都被修改

  1. void main() {
  2. staticDemo(); /// 22
  3. print(StaticClass.count); /// 2
  4. print(StaticClass.sum(20)); /// 22
  5. }
  6. void staticDemo() {
  7. StaticClass.count = 2;
  8. print(StaticClass.sum(20));
  9. }

对象操作符

我们知道对象置为null之后,再次访问对象内的属性,此时会报错。那么在Dart中如果规避呢

  1. void staticDemo() {
  2. var s1;
  3. s1 = StaticClass();
  4. print(s1.currentCount);
  5. s1 = null;
  6. print(s1.currentCount); ///此时访问会报错
  7. }

image.png
我们可以使用可以为空的类型?

  1. void staticDemo() {
  2. var s1;
  3. s1 = StaticClass();
  4. print(s1.currentCount);
  5. s1 = null;
  6. print(s1?.currentCount);
  7. }

image.png

强制类型转换

如果我们这么写肯定会报错,因为Object中没有currentCount

  1. void staticDemo() {
  2. var s1 = Object();
  3. s1 = StaticClass(); /// 多肽
  4. print(s1.currentCount);
  5. s1 = null;
  6. print(s1?.currentCount);
  7. }

image.png
在哪里调用就在哪里强制转换,转换过后就没有问题了。

  1. void staticDemo() {
  2. var s1 = Object();
  3. s1 = StaticClass(); /// 多肽
  4. print((s1 as StaticClass).currentCount);
  5. }

如果再次给s1赋值为null也会报错,因为第一次赋值的是Object,而Object不能为空。

  1. void staticDemo() {
  2. var s1 = Object();
  3. s1 = StaticClass(); /// 多肽
  4. print((s1 as StaticClass).currentCount);
  5. s1 = null;
  6. }

image.png
或者还可以这么判断:s1 is StaticClass

  1. void staticDemo() {
  2. var s1 = Object();
  3. s1 = StaticClass(); /// 多肽
  4. print((s1 as StaticClass).currentCount);
  5. if (s1 is StaticClass) {
  6. print(s1.currentCount);
  7. }
  8. }

链式语法

在Dart中可以使用链式语法..返回的是对象本身

  1. void staticDemo() {
  2. var s1 = Object();
  3. s1 = StaticClass(); /// 多肽
  4. print((s1 as StaticClass).currentCount);
  5. if (s1 is StaticClass) {
  6. print(s1.currentCount);
  7. var result = s1..currentCount = 15..sum1(20); /// 链式语法
  8. print(result);
  9. }
  10. }

image.png