Dart語言入門學習-類(五)

Dart 是一種基於類和 mixin 繼承機制的面向對象的語言。 每個對象都是一個類的實例,所有的類都繼承於 Object,這個和java語言沒什麼區別

使用類成員變量

我們看一下類的初始化以及賦值

 //類的初始化
var p = Point(2, 2);
// 爲實例的變量 y 設置值。
p.y = 3;

使用 ?. 來代替 . , 可以避免因爲左邊對象可能爲 null , 導致的異常:

// 如果類p不爲null,設置它的變量 y 等於 4。
p?.y = 4;

這個不同於java要有個空判斷,這裏不需要判斷,直接賦值符合前面加個?即可。

使用構造函數

創建類的實例有兩種方式,一種是通過類名,一種是通過類的標識符

void main() {
  var p1 = Human('男');
  var p2 = new Human('男');
  var p3 = Human.male('male', 2);
  var p4 = new Human.male('male', 2);
}

class Human {
  String gender;
  int age;
  Human(this.gender) {}
  Human.male(this.gender, this.age) {}
}

上面定義了一個Human類,創建類的實例的時候可以使用new,也可以不使用new。如果有常量構造函數,也可以通過在前面加上const創建一個常量,如果創建兩個相同的實例前面都有const,你們這兩個實例是相等的,否則不相等,我們來測試一下

void main() {
  var p1 = Human('男', 1);
  var p2 = Human('男', 1); // 創建一個非常量對象
  var p3 = const Human('男', 1);// 創建一個常量對象
  var p4 = const Human('男', 1);
  print(p1==p2);
  print(p3==p4);
  print(p1==p3);
}

class Human {
  final String gender;
  final int age;
  const Human(this.gender, this.age);
}

運行結果爲

false
true
false

因爲p3和p4是常量,所以他們初始化的對象是相等的,

獲取一個對象類型

使用對象的runtimeType關鍵字可以獲取對象的類型,

void main() {
  var p1 = Human('男', 1);
  print('The type of a is ${p1.runtimeType}');
}

運行結果爲

The type of a is Human

實例變量

我們之前說過在dart中數字也是個對象,所以當他沒初始化的時候,沒人值爲null,這個和java語言有點區別,我們看下

class Point {
  num x; // 聲明示例變量 x,初始值爲 null 。
  num z = 0; // 聲明示例變量 z,初始值爲 0 。
}

構造函數

在沒有聲明構造函數的情況下, Dart 會提供一個默認的構造函數。 默認構造函數沒有參數並會調用父類的無參構造函數。這個和java很相似,有參數的構造函數書寫有兩種方式

class Human1 {
  num x, y;
  Human1(num x, num y) {
    this.x = x;
    this.y = y;
  }
}

class Human2 {
  num x, y;
  Human2(this.x, this.y);
}

這兩種方式實現的結果都一樣,第一種方式是java中常見的,第二種方式相對來說更簡潔一些。構造函數還可以像上面通過添加標識符來構建。構造函數不能夠被繼承,父類的命名構造函數不會被子類繼承。 如果希望使用父類中定義的命名構造函數創建子類, 就必須在子類中實現該構造函數。

class Human2 {
  num x, y;
  Human2(this.x, this.y);

  // 標識符構造函數
  Human2.origin() {
    x = 0;
    y = 0;
  }
}

使用標識符構造函數可爲一個類實現多個構造函數。如果父類中沒有無參的構造函數, 則需要手工調用父類的其他構造函數。 在當前構造函數冒號 (😃 之後,函數體之前,聲明調用父類構造函數。

class Person {
  String firstName;
  Person.fromJson(Map data) {
    print('in Person');
  }
}

class Employee extends Person {
  Employee.fromJson(Map data) : super.fromJson(data) {
    print('in Employee');
  }
}

main() {
  var emp = new Employee.fromJson({});
  if (emp is Person) {
    emp.firstName = 'Bob';
  }
  (emp as Person).firstName = 'Bob';
}

方法

抽象類

隱式接口

繼承一個類

枚舉類型

給一個類添加mixins特性

類的變量和方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章