版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoleizhanghahaha/article/details/89790344
---故事四
//类与对象,声明,创建及基本特征 //使用关键字class 声明一个对象 //使用关键字new 创建一个对象,new 可省略 //所有对象都继承于 Object类 //import 'person.dart'; //void main(){ // var person= new Person(); // person.name="zhangsan"; // person.age=20; // print(person.name); // person.address; // person.work(); //} //---------------------------------- //类及成员可见性 // dart 中的可见性以 library(库) 为单位 //默认情况下,每一个 dart 文件就是一个库 //使用 _ 表示库的私有属性 //使用 import 导入库 //---------------------------------- //计算属性 //计算属性值是通过计算而来,本身不存储值 //计算属性赋值,其实是通过计算转换到其它实例变量 //void main(){ // var rect= new Rectangle(); // rect.height=20; // rect.width=10; // print(rect.area); //} //class Rectangle{ // num width, height; //// num get area{ //// return width * height; //// } // num get area =>width * height; //// num area(){ //// return width * height; //// } //} //---------------------------------- // 构造方法 //如果没有自定义构造方法,则会有个默认构造方法 //如果存在自定义构造方法,则默认构造方法无效 //构造方法不能重载 // 命名构造方法 //使用命名构造方法,可以实现多个构造方法 // 使用 类名.方法 的形式实现 //---------------------------------- //常量构造方法:对象声明成一个常量,构造方法也是一个常量const //如果类是不可变状态,可以把对象定义为编译时常量 //使用const声明构造方法,并且所有变量都为final //使用const 声明对象,可以省略 //void main(){ // const person= Person("张三",20,"mel"); //} //class Person{ // final String name; // final int age; // final String gender; // const Person(this.name,this.age,this.gender); // void work(){ // print('work .....'); // } //} //---------------------------------- //工厂构造方法 //工厂构造方法类似于设计模式中的工厂模式 //在构造方法前添加关键字 factory 实现一个工厂构造方法 //在工厂构造方法中可以返回对象 //class Logger{ // final String name; // static final Map<String,Logger> _cache= <String,Logger>{}; // factory Logger(String name){ // //工厂构造方法 是一个构建工厂 // if(_cache.containsKey(name)){ // return _cache[name]; // }else{ // final logger=Logger._internal(name); // _cache[name]=logger; // return logger; // } //// return Logger._internal("dart"); // } // Logger._internal(this.name); // void log(String msg){ // print(msg); // } //} //---------------------------------- //初始化列表 在构造方法前执行 //初始化列表会在构造方法体执行之前执行 //使用逗号分隔初始化表达式 //初始化列表常用于设置final变量的值 //void main(){ // var person= Person("张三",20,"mel"); //} //class Person{ // String name; // int age; // final String gender; // Person(this.name,this.age,this.gender); // Person.withMap(Map map): gender=map['gender']{ // //gender=map['gender'] 的执行在构造方法初始化前面 给final方法赋值 // this.name = map['name']; // this.age = map['age']; // } // void work(){ // print('work .....'); // } //} //---------------------------------- //静态成员 //使用 static 关键字来实现 属于类级别的变量和函数, 不属于对象级别 // 静态成员不能访问非静态成员,非静态成员可以访问 静态成员。 //类中的常量需要使用 static const 声明 //void main(){ //var page= new Page(); //Page.scrollDown(); //类名.方法名 //} //class Page{ // static const int maxPage=10; //声明静态常量 // static int currentPage=1; // //下滑 //static void scrollDown(){ // currentPage=1; // 只能访问静态 // print("ScrollDown..."); //} ////上滑 //void scrollUp(){ // currentPage++;//可以访问静态非静态的 // print("scrollUp..."); //} //} //---------------------------------- //对象操作符号 // 条件成员访问: ?. // 类型转换: as // 是否指定类型: is, is! // 级联操作: ... //void main(){ //// Person person; //// person?.name;//如果前面为空,不在执行 防止空指针 //// person?.work();//如果前面为空,不在执行 ////var person; ////person=""; //////person= new Person(); //动态类型 //////(person as Person).work();//转换之后调用 ////if (person is Person){ //// person.work(); ////} ////var person= new Person(); ////person..name="tome" //// ..age=20..work();// 级联操作 // new Person()..name="tome"..age=20 // 级联操作 // ..work(); //} //class Person{ // String name; // int age; // void work(){ // print("work ...."); // } //} //---------------------------------- //对象call 方法 // 如果类实现了 call() 方法的,测该类的对象可以作为方法使用 void main(){ var person= new Person(); person.name='zhangsan'; person.age=20; print(person("test",30));//对象作为一个方法调用 } class Person{ String name; int age; void work(){ print("name is $name,Age is $age"); } // void call(String name,int age){ // print("name is $name,Age is $age"); // } String call(String name,int age){//call 方法 return "name is $name,Age is $age"; } }
class Person{ String name; int age; String _birthday; bool get isAdult => age>18; void run(){ print("Person run ..."); } @override String toString() { return "Name is $name,Age is $age"; } }