Dart中的构造函数
Dart中的構造函數有4種,分別是:
- ClassName(...) //普通構造函數
- Classname.identifier(...) //命名構造函數
- const ClassName(...) //常量構造函數
- factroy ClassName(...) //工廠構造函數
?普通構造函數
普通構造函數可以分為無參構造函數和有參構造函數。
如果不聲明構造函數,則dart會提供一個默認的無參構造函數。當然,也可以自己定義有參構造函數,如果自己寫了構造函數,那么默認構造函數就不存在了。
我們可以這么來定義一個有參構造函數
class People{int? age;String? name;People(int age, String name){this.age = age;this.name = name;} }這種賦值方式如果變量很多的話寫起來比較麻煩,所以dart提供了語法糖來簡化,直接在參數列表上這么寫:
class People{int? age;String? name;People(this.age, this.name); }注意:
- Dart?構造函數不允許重載,即不允許有相同名稱的構造函數,否則編譯器會報錯
如果想設置不同的參數可通過可選參數列表來設置:
class People{int? age;String? name;People({this.age, this.name}); }這種寫法涵蓋了這么幾種形式:
People(); People(this.age); People(this.name); People(int age, String name);- 當子類繼承父類時,初始化子類構造函數會優先初始化父類構造函數,繼承時需要使用?super調用父類構造函數,若父類為無參構造函數時可以省略。
命名構造函數
格式:類名.構造函數名
class People{int? age;String? name;People.fromMap(Map map){this.age = map["age"];this.name = map["name"];} }使用命名構造函數可為一個類實現多個構造函數,但是同樣是不能重載。
如果一個里只有命名構造函數,那么子類需要顯示調用父類的命名構造函數。
class B extends People{B(Map map) : super.fromJson(map); }否則會報錯
初始化列表
除了調用父類的構造函數,你還可以在執行構造函數體及調用父類構造函數之前初始化實例變量,使用逗號分隔每個初始化變量。
class Employee extends People {int? no;String? job;String? address;int? age1;Employee(this.job, this.address, int? age): this.no = 123456,age1 = age ?? 25,super(age: age); }調用的順序如下:
- 初始化列表
- 父類的構造函數
- 子類的構造函數
參數列表對于初始化那些final修飾的成員變量很有用,因為在方法體中,不能給final修飾的成員變量賦值,因為在執行方法體的時候,final修飾的成員變量已經不能變了。
注意:
- 傳遞給父類構造函數的參數及初始化表達式的右邊不能使用?this?關鍵字和訪問實例成員變量,因為在參數傳遞的這一步驟,子類構造函數尚未執行,子類的實例對象也就還未初始化,因此所有的實例成員都不能被訪問。
- 同一實例成員在參數列表和初始化列表中不能同時存在,
構造函數傳遞(重定向構造函數)
定義構造函數的時候,除了可以定義一個普通構造函數之外,還可以定義若干個命名構造函數,這些構造函數之間,有時候會有一些相同的邏輯,如果分別寫在各個構造函數中,會顯得有些多余,所以構造函數可以傳遞。傳遞構造函數是沒有方法體的,可以在初始化列表中,調用另一個構造函數。
class Point {final num x;final num y;final num area;Point(x, y): this.x = x,this.y = y,this.area = x * x + y * y;Point.alongXAxis(num x) : this(x, 0); }如果添加方法體,編譯器會報錯。
常量構造函數
如果生成類的對象是不會變的,可以定義常量構造函數(如果你的類,創建的對象永遠不會改變,你可以在編譯期就創建這個常量實例,并且定義一個常量構造函數,并且確保所有的成員變量都是final的。)。
class Point {final num x;final num y;final num area;const Point(x, y): this.x = x,this.y = y,this.area = x * x + y * y; }在使用時需注意:
工廠構造函數
有時候可能有一種需求,并不需要每次都創建新的類實例,而是每一種情況,只需要一個實例,這時候工廠構造函數就派上用場了。
工廠構造函數使用關鍵字factory來定義,factory可以放在類名函數之前,也可以放在命名函數之前。
使用場景:
注意:
總結
以上是生活随笔為你收集整理的Dart中的构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Kotin 极简教程》第7章 面向对象
- 下一篇: 关于未来几年的发展,闰土有话要说