简单易懂的Dart基础语法,类方法和对象操作符。

932

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

类方法

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

class StaticClass {
  // 静态
  static int count = 1;
  static int sum(int a){
    return a + count;
  }
}

这里的静态方法也就相当于类方法:

image.png

在静态方法里面不能访问非静态成员:

class StaticClass {
  // 静态
  static int count = 1;
  int currentCount = 0;

  static int sum(int a){
    return a + count + this.currentCount;
  }
}

image.png

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

class StaticClass {
  // 静态
  static int count = 1;
  int currentCount = 0;

  static int sum(int a){
    return a + count ;
  }
  int sum1(int a) {
    return currentCount + a + count;
  }
}

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

void main() {
  staticDemo(); /// 22
  print(StaticClass.count); /// 2
  print(StaticClass.sum(20)); /// 22
}

void staticDemo() {
  StaticClass.count = 2;
  print(StaticClass.sum(20));
}

对象操作符

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

void staticDemo() {
  var s1;
  s1 = StaticClass();
  print(s1.currentCount);
  s1 = null;
  print(s1.currentCount); ///此时访问会报错
}

image.png

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

void staticDemo() {
  var s1;
  s1 = StaticClass();
  print(s1.currentCount);
  s1 = null;
  print(s1?.currentCount);
}

image.png

强制类型转换

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

void staticDemo() {
  var s1 = Object();
  s1 = StaticClass(); /// 多肽
  print(s1.currentCount);
  s1 = null;
  print(s1?.currentCount);
}

image.png

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

void staticDemo() {
  var s1 = Object();
  s1 = StaticClass(); /// 多肽
  print((s1 as StaticClass).currentCount);
}

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

void staticDemo() {
  var s1 = Object();
  s1 = StaticClass(); /// 多肽
  print((s1 as StaticClass).currentCount);
  s1 = null;
}

image.png

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

void staticDemo() {
  var s1 = Object();
  s1 = StaticClass(); /// 多肽
  print((s1 as StaticClass).currentCount);
  if (s1 is StaticClass) {
    print(s1.currentCount);
  }
}

链式语法

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

void staticDemo() {
  var s1 = Object();
  s1 = StaticClass(); /// 多肽
  print((s1 as StaticClass).currentCount);
  if (s1 is StaticClass) {
    print(s1.currentCount);
    var result = s1..currentCount = 15..sum1(20); /// 链式语法
    print(result);
  }
}

image.png