Dart中的对象操作符:
? 条件运算符 (了解)
as 类型转换
is 类型判断
.. 级联操作 (连缀) (记住)
1、?(问号)
“?”同kotlin语言的“?.”差不多,主要是用来判空,若改对象为null,则不会继续调用其方法,防止出错:
void main() {
var obj = null;
//这里定义的类型,如果是明确类型如:自定义类
//赋值为null时会提示:
// A value of type 'Null' can't be assigned to a variable of type "xxx"
//只有var类型可以赋值为null。
//运行发现,没有?.时会crash,有?.会打印出null,防止出错,当obj为null时不会继续调用具体方法
print(obj?.work);
}
2、as 类型转换
as使用时注意,转换只能是子类转换成父类,不能父类as子类。
错误情况:
class Person {
String name;
int age;
Person()
: name = "小样儿",
age = 12 {}
void working() {
print("Person is working");
}
}
class WoMan extends Person{
String work = "";
void run(){
print("woman run");
}
}
void main() {
var obj = Person();
//使用as时需要注意:1、只能是对象是子类,通过as转换成父类。不能是obj是父类对象然后as成子类。
//type 'Person' is not a subtype of type 'WoMan' in type cast
obj as WoMan;
obj.working();
}
上述main方法中的as方法会报错:
type 'Person' is not a subtype of type 'WoMan' in type cast
意思是Person类不是WoMan的子类,不能转换。
正确用法是:
void main() {
var obj = WoMan();
obj as Person;
obj.working();
}
打印结果:
Person is working
证明转换成功!!!
3、is 类型判断
is用于判断当前对象是否是对应类型,是的话表达式的值是true,反之为false。
void main() {
var obj = Person();
if(obj is Person){
print("obj is Person");
}else{
print("is 错了");
}
}
4、..级联操作(连缀)
class Person {
String name;
int age;
Person()
: name = "小样儿",
age = 12 {}
void setName(String n) {
this.name = n;
}
void setAge(int age) {
this.age = age;
}
void working() {
print("Person is working 姓名:$name -- 年龄:$age");
}
}
void main() {
var obj = Person();
//..级联操作符,相当于一直在当前对象上进行调用一连串方法
//书写时尽量对齐,不对齐也可以,只是看起来不舒服而已。
obj..setName("张三")
..setAge(50)
..working();
}
打印结果:
Person is working 姓名:张三 -- 年龄:50
连缀也可以写成一排:
obj..setName("张三")..setAge(50)..working();
网友评论