一、Dart中的变量与常量
1.变量
dynamic和Object
2、常量
final和const区别:
- final 与 const 修饰的变量取值时机不同。 const编译时常量,final是运行时常量(在第一次使用时被初始化),可以理解为’懒加载’
- final可修饰实例变量、const不可以修饰实例变量,类级别的常量,通常用
static const
- 应用范畴不同,final 只可用来修饰变量const 关键字即可修饰变量也可用来修饰 常量构造函数
- 相同内容对象创建不同。内存中重复创建值,相同时final在内存中重复创建,const会引用相同值
//2.
class A{
static const B = 0;
}
print(A.B)
//5.
class A{}
final A a = new A();
final和const相同点:
- 都必须初始化
final height = 10;
- 类型声明可以省略
final String a = 'abc';
,final a = 'abc';
- 初始化后就不能进行赋值
final a = 'aaa';a = 'abc';
错误 - 不能和var同时使用
final var a = 'abc';’
错误
3、 dynamic和Object
不同点:
dynamic与Object不同的是,dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用Object的属性与方法, 否则编译器会报错. 如:
dynamic a;
Object b;
main() {
a = "";
b = "";
printLengths();
}
printLengths() {
// no warning
print(a.length);
// warning:
// The getter 'length' is not defined for the class 'Object'
print(b.length);
}
二、基本数据类型
- Dart 中 number 类型分为 int 和 double
- 以bool代表布尔值,只有两个对象是布尔类型的,那就是true和false所创建的对象,这两个对象都是编译时常量。
- String字符串
- List数组
- Map集合
三、Dart函数和运算符
dart中的函数和JavaScript中有点类似。你需要定义就是函数的名字、返回值(有返回值或者void)、参数。
void test(){
var name = fullName('可可', '吃货');
print(name);
}
String fullName(String firstName, String lastName) {
return "$firstName $lastName";
}
命名参数
dart有个叫命名参数的东西。当你调用函数的时候,你必须指定参数的名字。要使用命名参数,可以将函数的参数包括在花括号{}内
- 算术运算符
- 比较运算符
- 复合运算符
- 逻辑运算符
- 位运算符
- 条件运算符
- 级联运算符
- 点运算符
var a = 9;
print(a??"10");//如果a的值为空那么变赋值给问号后面的值
print(a??="10")//与上面的语义一样
//级联运算符
/*
让开发者对某个连续的对象进行一系列的操作,减少中间变量的产生
*/
//点运算符
class A{
String name;
}
var p = A();
p.name="";
p?.a//null,如果调用的值为空那么就返回null否则就是正常访问
四、分支语句
- if和else
- for循环
- while循环
- break和continue
- switch和case
- 异常处理
switch(20){
case:10
print("");
}
异常处理
五、Dart面向对象
1.使用函数
- 自定义函数
- 定义可选参数
class A{String name;A({this.name}); }
- 函数可选默认值
class A{String name;A({this.name=李白“”}); }
- 匿名函数
((){})
- 词法作用域(作用域可以防止变量被污染)
- 闭包(闭包也是函数,离开变量作用域会失效)
2.Dart中的类
构造函数:
构造方法通常与类名相同,this指向当前实例化对象
- 普通构造函数
var cat = new Cat("逗比", 12);
class Cat {
String name;
int age;
Cat(String name, int age) {
this.name = name;
this.age = age;
}
}
- 命名构造函数
Map map = new Map();
map['name']= "哈巴狗";
map['age'] = 5;
Dog d = new Dog.newBorn(map);
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn(Map json) {
name = json['name'];
age = json['age'];
}
}
继承类:可以使用extends关键字继承其他的类
调用父类中的普通构造方法
class People{
String name;
void getName(){
print("name:${name}");
}
}
class Teacher extends People{
void getName(){
super.getName();
print("name:${name}");
}
}
调用父类中构造方法
class People{
String name;
void getName(){
print("name:${name}");
}
}
class Teacher extends People{
Teacher(String name):super(name);
}
重载和重写:@override
重写父类方法
class People{
String name;
void getName(){
print("name:${name}");
}
}
class Teacher extends People{
@override
void getName(){
print("");
}
}
多类继承Mixin(拓展类)
dart中只支持单继承,但是想要继承多个类怎么办呢,Dart中的Mixins通过创建一个新类来实现,该类将mixin的实现层叠在一个超类之上以创建一个新类
class A{}
class B{}
class C extends A with B{}
//遇到相同功能的函数,最后载入的会覆盖之前的函数定义
抽象类:
实际上就是一个接口,只需要在类声明前添加abstract关键字,方法不需要。方法只需要签名,不需要实现。
abstract class TeacherInterface{
void teaching();
}
class Teacher implement TeacherInterface{
void teaching(
print(""));
}
//也可以实现多个接口
泛型
DataHolder<String> dataHolder = new DataHolder('Some data');
print(dataHolder.getData());
dataHolder.setData('New Data');
print(dataHolder.getData());
//下面这个会报错,因为dataHolder对象在创建的时候就已经限制为String类型
dataHolder.setData(123);
print(dataHolder.getData());
class DataHolder<T> {
T data;
DataHolder(this.data);
getData() {
return data;
}
setData(data) {
this.data = data;
}
}
3.异步编程
异步编程(上)
异步编程(下)