企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 面向对象 1. 类与对象,声明,创建及基本特性 2. 构造方法及初始化列表 3. 静态成员及对象操作符的使用 ## 类与对象 1. class声明 2. new 创建对象 3. 所有对象都继承于Object 类 ## 属性和方法 1. 属性默认生成getter和setter方法 2. **使用final声明的属性只有getter方法** 3. .访问 4. 方法不能重载(不能重名) ~~~ void testDart(){ var person = new Person(); //new可以省略 person.name="guo"; person.age = 12; person.work(); } class Person{ String name; int age; void work(){ print("Name is $name, age is $age"); } } ~~~ ## 类及成员可见性 1. Dart中的可见性以library(库)为单位 2. 默认情况下,每一个Dart文件就是一个库 3. 使用_表示库的私有性(只在当前.dart文件有效,对外不可见) 4. 使用import导入库 test.dart ~~~ class Person{ String name; int age; int _pri; //私有属性 void work(){ print("Name is $name, age is $age"); } } ~~~ main.dart ~~~ import 'test.dart'; void testDart(){ var person = new Person(); //new可以省略 person.name="guo"; person.age = 12; person.work(); } ~~~ ## 计算属性 1. 计算属性的值是通过计算而来,本身不存储值 2. 计算属性赋值,其实是通过计算转换到其他实例变量 ~~~ void testDart(){ var rect = new Rectangle(); rect.height = 20; rect.width = 10; print(rect.area); } class Rectangle{ num width,height; num get area{ return height * width; } // num get area => width* height; } ~~~ 计算属性的赋值 ~~~ void testDart(){ var rect = new Rectangle(); rect.height = 20; rect.width = 10; print(rect.area); // 200 rect.area = 200; print(rect.width); //40 } class Rectangle{ num width,height; num get area => height * width; set area(value){ width = value/5; } } ~~~ ## 构造方法 1. 如果没有自定义的构造方法,则有默认的构造方法 2. 如果存在自定义构造方法,默认构造方法无效 3. 构造方法不能重载(多个) ~~~ class Person{ String name; int age; final String gender='male'; //Person(this.name,this.age){print(name)}; 语法糖 Person(String name, int age){ this.name = name; this.age = age; } void work(){ print("Name is $name, age is $age"); } } ~~~ 语法糖与final ~~~ void testDart(){ var person = new Person("guo", 20, 'male'); //new可以省略 person.work(); } class Person{ String name; int age; final String gender; //语法糖中,先赋值,再执行构造函数,因此可以final定义的变量初始化赋值 Person(this.name, this.age, this.gender); void work(){ print("Name is $name, age is $age"); } } ~~~ ## 命名构造方法 1. 使用命名构造方法,可以实现多个构造方法 2. 使用类.方法的形式实现 **Person.withName** ~~~ void testDart(){ var person = new Person("guo", 20, 'male'); //new可以省略 person.work(); var person1 = new Person.withName('gender'); person1.work(); } class Person{ String name; int age; final String gender; //语法糖中,先赋值,再执行构造函数,因此可以final定义的变量初始化赋值 Person(this.name, this.age, this.gender); Person.withName(this.gender); void work(){ print("Name is $name, age is $age,gender is $gender",); } } ~~~ ## 常量构造方法 1. 如果类是不可变的状态(属性都是常量,或final,只可以设置一次),可以把对象定义为编译时常量 2. 使用const声明构造方法,并且所有变量都为final 3. 使用const声明对象,可以省略 常量在运行时速度很快,因为编译时值已经确定了 ~~~ void testDart(){ const person = const Person("guo", 20, 'male'); //new可以省略 person.work(); } class Person{ final String name; final int age; final String gender; //语法糖中,先赋值,再执行构造函数,因此可以final定义的变量初始化赋值 const Person(this.name, this.age, this.gender); void work(){ print("Name is $name, age is $age,gender is $gender",); } } ~~~ ## 工厂构造方法 1. 工厂构造方法类似于设计模式中的工厂模式 2. 在构造方法前添加**关键字factory**实现一个工厂构造方法 3. 在工厂构造方法中可以**返回对象**,不能返回null ~~~ class Logger{ final String name; //声明Map 泛型,限定key和value 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; } } //命名构造方法 私有 Logger._innernal(this.name); void log(String msg){ print(msg); } } ~~~ ## 初始化列表 final属性的赋值需要在构造方法之前执行,比如之前的语法糖方法。 1. 初始化列表会在构造方法体执行之前执行 2. 使用逗号分隔初始化表达式 3. **初始化列表常用于设置final变量的值。** ~~~ void testDart(){ var person1 = new Person.widthMap({'name':'xxx','age':22,'gender':'male'}); person1.work(); } class Person{ String name; int age; final String gender; Person(this.name, this.age, this.gender); //:gender=map["gender"] 为初始化列表,直接跟在构造方法之后,执行时间在构造方法之前,也可以对普通属性赋值,逗号分隔 Person.widthMap(Map map):name = map["name"],gender=map["gender"]{ this.age = map["age"]; } void work(){ print("Name is $name, age is $age,gender is $gender",); } } ~~~ ## 静态成员 1. 使用static关键字来实现**类级别**的变量和函数 2. 静态成员不能访问非静态成员,非静态成员可以访问静态成员 3. 类中的常量需要使用**static const**声明 ~~~ void testDart(){ var page = new Page(); Page.scrollDown(); } class Page{ //类中常量 static const int maxPage = 10; static int currentPage = 1; //下滑 static void scrollDown(){ currentPage = 1; print('scroll down...'); } //上滑 非静态可访问静态 void scrollUp(){ currentPage++; print('scroll up...'); } } ~~~ ## 对象操作符 1. 条件成员访问:?. 2. 类型转换:as 3. 是否指定类型 is, is! 4. **级联操作符: ..**,赋值之后返回的对象还是当前对象 ~~~ void testDart(){ Person person;//此时person为null,不能调用属性和方法,会报错 person?.work(); Person person1 = new Person(); person1?.work(); } class Person{ String name; int age; void work(){ print('working...'); } } ~~~ 不明确对象是否为空的时候,使用?.操作符 ~~~ void testDart(){ var person; person = ""; /* person = new Person(); (person as Person).work(); */ person = new Person(); if(person is Person){ person.work(); } } class Person{ String name; int age; void work(){ print('working...'); } } ~~~ ~~~ void testDart(){ var person = new Person(); new Person()..name = "guo" ..age = 20 ..work(); print(person.age); } class Person{ String name; int age; void work(){ print('working...'); } } ~~~ ## 对象call方法 方法是可以作为对象使用的,在dart中对象也可以作为方法使用。 1. 如果类实现了call()方法,则**该类的对象可以作为方法使用**。 不建议使用,代码会变得复杂 ~~~ void testDart(){ var person = new Person(); person..name = "guo" ..age = 20; person('test', 30); print(person.age); //20 } class Person{ String name; int age; /* void work(){ print('name is $name, age is $age, working...'); } */ String call(String name, int age){ print('name is $name, age is $age, working...'); return 'name is $name, age is $age, working...'; } } ~~~ ## 小结 1. 类的声明,对象创建,属性,方法,可见性,计算属性 2. 构造方法,命名构造方法,常量构造方法,工厂构造方法 3. 初始化列表,静态成员,操作符,call方法