1. 主函數
(1) 沒有public static
(2) 命令參數List<String> args
void main() { }
2. 可以在class外定義變量,方法等
3. 沒有public, private, protected關鍵字
4. 創建對象,new可選
5. 獲取值${variableValue}, ${expression}
6. Class中屬性默認public,若聲明私有,只需在屬性名前加_
class Bicycle { int cadence; int _speed = 0; int get speed => _speed; int gear; Bicycle(this.cadence, this.gear); void applyBrake(int decrement) { _speed -= decrement; } void speedUp(int increment) { _speed += increment; } @override String toString() => 'Bicycle: $_speed mph'; } void main() { var bike = Bicycle(2, 1); print(bike); }
7. getter/setter方法
//返回值類型/get/外部可訪問屬性/方法體 int get speed => _speed
//set/外部可訪問屬性(值)/方法體 set speed(int value) => _speed = value;
8. 未初始化的變量值均為null
9. 構造函數簡化,避免重載
import 'dart:math'; class Rectangle { Point origin; num width; num height; Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0}); @override String toString() => 'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height'; } void main() { print(Rectangle(origin: const Point(3,4), width: 10, height: 20)); print(Rectangle(origin: const Point(10,20))); print(Rectangle(width: 20)); print(Rectangle()); }
10. 一個dart文件中可以定義多個class,也可以僅僅定義方法
//factory.dart import 'shapes.dart'; Shape shapeFactory(String type){ if(type == 'circle') return Circle(2); if(type == 'square') return Square(2); throw 'Can\'t create $type'; }
11. 字符串可用單引號或者雙引號
12. 工廠構造函數 => 在抽象類中定義工廠函數,規定子類實例化方式
abstract class Shape { //factory constructor factory Shape(String type){ if(type == 'circle') return Circle(10); if(type == 'square') return Square(10); throw 'can\'t create $type'; } num get area; }
13. Dart中沒有interface關鍵字,每個類都可以做接口
import 'shapes.dart'; class CircleMock implements Circle { num area; num radius; }
// A person. The implicit interface contains greet(). class Person { // In the interface, but visible only in this library. final _name; // Not in the interface, since this is a constructor. Person(this._name); // In the interface. String greet(String who) => 'Hi $who, I\'m $_name'; } // An implementation of the Person interface. class Impostor implements Person { @override String get _name => this._name; @override String greet(String who) => 'Hi $who, do you know who I am?'; } //polymorphism String greetBob(Person person) => person.greet('Bob'); main() { print(greetBob(Person('chris'))); print(greetBob(Impostor())); }
14. 同一對象級聯操作
通過..符號可以在同一對象上級聯操作。
querySelector('#confirm') // Get an object. ..text = 'Confirm' // Use its members. ..classes.add('important') ..onClick.listen((e) => window.alert('Confirmed!'));
15. 函數無需聲明可能拋出的異常類型
16. 捕獲異常
try { // ··· } on Exception catch (e) { print('Exception details:\n $e'); } catch (e, s) { print('Exception details:\n $e'); print('Stack trace:\n $s'); }
17. 在運行時,Dart保留泛型類型信息
var names = List<String>(); names.addAll(['Seth', 'Kathy', 'Lars']); print(names is List<String>); // true