## 面向对象
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方法
- 空白目录
- Flutter入门
- 课程简介
- 开发环境搭建
- 常用组件讲解
- 案例实战
- Dart编程语言入门
- 介绍和开发准备
- 数据类型
- 运算符
- 控制流语句
- 方法
- 面向对象1
- 面向对象2
- 枚举&类型
- Flutter中文网
- Widget框架总览
- 在Flutter中构建布局
- Flutter for Web开发者
- Flutter入门实战
- flutter介绍
- Flutter目录结构,各种组件
- Container、Text
- 图片组件Image
- ListView
- 动态组件
- GridView组件
- 页面布局Padding,Row,Column,Expanded,Icon
- Stack层叠组件,Align,Positioned
- AspectRatio,Cart
- wrap组件
- 组件汇总
