var j;//Object类型,如果指定了值 就是具体类型,没有指定就是Object类型
j = 10;
j = “huo”;
dynamic z = “huo”;//不是编译的时候确定的 而是运行的时候确定的
z = 100;
final i = 1;//运行时常量
const z = i;//error ,运行期的常量不能给编译器的常量赋值
const j = 1;//编译期常量
List<int> list = const [1,2,3];//list对象不可变 list.add(1) error 编译期没问题,运行就报错
const List<int> list = [1,2,3];//list引用不可变 list = [1,2,3]; error 编译期就会提示错误 list.add(1) error 也报错误
Unicode: Runes
代码点与代码单元
Symbols 内置类型
studio 魔板代码 live
function
typedef void F(int i,int j);//给一个方法定义类型
void fun3(void f1(int i,int j)){
}
//没有java的重载方法,dart是下面的实现方式
可选位置参数fun([int i,int j])
可选命名参数fun({int i,int j})
异常:比较灵活可以抛出异常,也可以抛出一个类比如int String等等。
void test(){
throw Exception(“XXXXX”); 抛出异常
//throw Error(); 抛出error
//throw 11; 抛出int
//throw “XXXXX” 抛出字符串
}
//普通的异常处理
try{
…
}catch(e,s){
//e 异常内容信息 e:XXXXX
//s,异常的调用栈信息,s:StackTrace
}
不同的异常做不同的处理
try{
test()
} on Exception catch(e,s){
……
} on int catch(e){
……
} on String catch(e){
…..
} on Function catch(e){ ….
}
类
dart class 没有作用域private public protected等特殊字符,私有属性以下划线开头,类也是下划线开头就是私有类
库、文件名 命名 lowercase_with_underscoures
其他的都是 驼峰标识 class field 等等
构造方法
class Point{
int _x;
int y;
//1.方式一
Point(this._x,this.y);
//2,方式二
Point({int x,int y}){//可以有大括号的构造方法,但是不能用this关键字。
}
//3,方式三 命名构造方法
//dart不允许有重载方法,但是构造函数多个参数重重在如何实现呢,下面的方式给他一个名字
//命名构造方法 有上面的大括号的方式为什么还要下面的呢,下面的通过命名就可以知道里面传递的参数,更好的设计代码
Point.Y(this.y);
Point.X(this._x) Point.XY() :_x=1,y=2//参数初始化列表
Point.fromMap(Map map):_x=map[“x”],y=map[“y”]//参数初始化列表
Point.fromMap(Map map):{//参数初始化列表 _x=map[“x”],
y=map[“y”]
}
Point.main(int x):this(x,0);//调用主构造方法
//注意:
//常量构造方法 成员属性必须要是final的
//const Point(this._x,this.y);
//使用const 来创建的多个对象,如果构造方法是常量构造方法,并且传递的参数也是一样的,那么这几个对象是同一个编译期常量
// var p1 = const Point(1,1); // var p2 = const Point(1,1); // p1 == p2
//工厂构造方法 必须要返回实例对象
factory Point.get(int x){ return Point(x,1);
}
//可以用来实现单例 如下: //static Point _instance;//静态的属性
//Point._newInstance();//私有命名构造方法
//factory Point.getInstance(){
// if(_instance == null){
// _instance = Point._newInstance();
// }
//}
//属性调用是调用了隐式的get,与set方法
//int _x;
// int get x => _x;//x其实是一个方法名字,并不是类属性
// int get x => _x+1;表达式
// int get _x => _x+1;error 因为_x有了隐式的get方法了这里又定义,dart不支持重载方法,所以会报错
// set xxxxx(int x) => _x = x;
//运算符重载 格式:operator 运算符
//Point operator +(Point other){
// var point = Point();
// point._x = + _x + other._x;
// return point;
//}
}
dart 没有interface,但是其任何类都可以看成一个接口
class Test1{}
class Test2 implement Test1{}
类里面有call方法,只有可以用对象调用该方法
class Test{
void call(){}
}
Test test = Test();
test();//调用Test的call()方法 没有call方法就报错,groovy也是这样兼容java
混合mixins
被混入的类不能有构造方法