类方法
Dart中的类方法也就是静态方法,访问的时候直接使用类去访问,不用创建实例变量。
class StaticClass {
// 静态
static int count = 1;
static int sum(int a){
return a + count;
}
}
这里的静态方法也就相当于类方法:
在静态方法里面不能访问非静态成员:
class StaticClass {
// 静态
static int count = 1;
int currentCount = 0;
static int sum(int a){
return a + count + this.currentCount;
}
}
但是在实例方法里面可以访问非静态成员,也可以访问静态成员
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); ///此时访问会报错
}
我们可以使用可以为空的类型?
void staticDemo() {
var s1;
s1 = StaticClass();
print(s1.currentCount);
s1 = null;
print(s1?.currentCount);
}
强制类型转换
如果我们这么写肯定会报错,因为Object
中没有currentCount
void staticDemo() {
var s1 = Object();
s1 = StaticClass(); /// 多肽
print(s1.currentCount);
s1 = null;
print(s1?.currentCount);
}
在哪里调用就在哪里强制转换,转换过后就没有问题了。
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;
}
或者还可以这么判断: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);
}
}