main(List<String> args) {
var p = Person('ksj', 29);
var p1 = Person.withNameAgeAndHeight('ksj', 22, 178);
print(p1.toString());
// 父类应用指向子类对象
// Object obj = 'ksj';
// 会报错的写法
// print(obj.substring(1));
/* dynamic 和 Object 的区别:
Object编译时报错、dynamic编译时不报错,但是运行时存在潜在风险
需要增加类型判断
*/
dynamic obj = 'ksj';
print(obj.substring(1));
var p2 = Person.form({
"name1" : "1",
"name2" : "2",
"name3" : "3",
});
}
class Person {
String name;
int age;
double height;
// Dart提供给我们的语法糖
Person(this.name, this.age);
// Dart里面没有重载
// 命名构造函数
Person.withNameAgeAndHeight(this.name, this.age, this.height);
Person.form(Map<String, dynamic> mapst);
// 重写类的方法进行覆盖
@override
String toString() {
// TODO: implement toString
return "$name $age $height";
}
}
class Person {
final String name;
final int age;
// 如果初始化不赋值,以后再也不能赋值了
// C++里面就有这样的语法
// 默认值的传入
// 源码中特别喜欢用这种方法——初始化列表
// 作用,如果创建对象时,有传入一个age,那么就使用传入的阿哥,如果没有传入age,那么使用一个默认值
Person(this.name, {int age}): this.age = age ?? 10 {
// 大括号里面的代码执行的时候,代码就被初始化了
// this.age = age;
}
const temp = 20;
Person(this.name, {int age}): this.age = temp > 20 ? 30 : 50 {
// 大括号里面的代码执行的时候,代码就被初始化了
// this.age = age;
}
// 上面是官方推荐,
Person(this.name, {this.age = 10});
Person(this.name, {this.age = temp ?? 30 });
// 局限性:下面局限性只能做确定的值赋值操作,不能做三目运算等不确定的操作
// 保留着
// 默认值里面只能给具体值,不能给函数调用
// 解除疑惑:
}
网友评论