帶你Dart帶你飛之類的構造方法
在前面的系列文章(文章末尾會有傳送門哦~~)都是些比較簡單的基礎概念,之後就要開始介紹一些注重理解和手動實踐的Dart知識了。這篇的內容主要是Dart中的類的構造方法。
Dart是一種面向物件的語言,具有類和基於mixin的繼承。每個物件都是一個類的例項,所有的類都是Object的子類。
核心內容如下
- 普通構造方法
- 常量構造方法
- 初始化列表
- 工廠構造方法
類的成員
和java語言類似,使用點號(.)引用例項變數或方法
var p = Point(2, 2);
// Set the value of the instance variable y.
p.y = 3;
但它還可以這麼寫
// If p is non-null, set its y value to 4. p?.y = 4;
這是為避免最左運算元為空時出現異常,使用 ?.代替 .
構造方法
-
普通構造方法
如果不宣告構造方法,則為您提供預設構造方法。預設構造方法沒有引數,並在超類中呼叫無引數建構函式。
如果有多個構造方法,構造方法的寫法和Java不太一樣。即使構造方法的引數不同,這些構造方法的命名也不能重複
那如果有多個構造方法,我們可以通過ClassName.identifier作為它的構造方法,比如下面的Point.fromJson
class Point{ var x; var y; Point(var x,var y){ this.x=x; this.y=y; } Point.fromJson(Map<String, int> map) { x=map['x']; y=map['y']; } }
呼叫構造方法
var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});
當然我們這裡的new關鍵字是可以省略的
在Dart2中new關鍵字為可選關鍵字
-
常量構造方法
class ImmutablePoint {
final num x, y;
const ImmutablePoint(this.x,this.y);//常量構造方法
}
常量構造方法需要新增關鍵字const,並且是沒有身體的,直接在末尾加;即可
var a = const ImmutablePoint(1, 1); var b = const ImmutablePoint(1, 1); assert(identical(a, b)); print(a==b); //true print(b); //Instance of 'ImmutablePoint'
構造兩個相同的編譯時常量會生成一個單一的、規範的例項
在常量上下文中,可以在建構函式或文字之前省略const。例如,它建立了一個const的 map集合
//這裡用來很多const
const pointAndLine = const {
'point': const [const ImmutablePoint(0, 0)],
'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};
//可以省略除第一個外的其他const
const pointAndLine = {
'point': [ImmutablePoint(0, 0)],
'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};
-
初始化列表
上面的Point類我們可以這麼寫
Point.fromJson(Map<String, int> map):
x=map['x'],
y=map['y']{
print('In Point.fromJson(): ($x, $y)');
}
呼叫超類構造方法之外,還可以在建構函式主體執行之前初始化例項變數,初始值設定項用逗號分開。
可以通過在初始化列表中使用assert來驗證輸入
Point.withAssert(this.x, this.y) : assert(x >= 0) {
print('In Point.withAssert(): ($x, $y)');
}
這樣寫有什麼好處呢?
初始化列表在設定final欄位時很方便
我們在構造方法的body裡設定final變數是不能編譯通過,但通過這種方式就是ok的
import 'dart:math';
class Point {
final num x;
final num y;
final num distanceFromOrigin;
Point(x, y)
: x = x,
y = y,
distanceFromOrigin = sqrt(x * x + y * y);
}
main() {
var p = new Point(2, 3);
print(p.distanceFromOrigin);
}
///執行結果
3.605551275463989
-
工廠構造方法
工廠構造方法可以從快取返回例項,也可以返回子型別的例項。
在實現構造方法時使用factory關鍵字,工廠構造方法並不總是建立類的新例項。
class Logger {
final String name;
bool mute = false;
//用於快取已經例項化的物件
static final Map<String, Logger> _cache =
<String, Logger>{};
factory Logger(String name) {
if (_cache.containsKey(name)) { //如果map快取裡存在直接返回例項
return _cache[name];
} else { //如果map快取裡不存在,則返回新的例項
final logger = Logger._test(String name):this.name=name;;
_cache[name] = logger;
return logger;
}
}
//???
Logger._internal(this.name);
void log(String msg) {
if (!mute) print(msg);
}
}
上面程式碼還是比較好理解的,不知道在我標記問號的那句程式碼你有沒有懵逼?反正我看的時候是感覺有點奇怪的。
其實仔細一研究,它其實等價於這樣的寫法
Logger._internal(String name):this.name=name;
相關推薦
帶你Dart帶你飛之類的構造方法
在前面的系列文章(文章末尾會有傳送門哦~~)都是些比較簡單的基礎概念,之後就要開始介紹一些注重理解和手動實踐的Dart知識了。這篇的內容主要是Dart中的類的構造方法。 Dart是一種面向物件的語言,具有類和基於mixin的繼承。每個物件都是一個類的例項,所有
帶你Dart帶你Diao之類(一)
在前面的系列文章(文章末尾會有傳送門哦~~)都是些比較簡單的基礎概念,之後就要開始介紹一些注重理解和手動實踐的Dart知識了。這篇的內容主要是Dart中的類的構造方法。 Dart是一種面向物件的語言,具有類和基於mixin的繼承。每個物件都是一個類的例項,所有的類都是Obje
帶你Dart帶你Diao之類(二)
在上一篇部落格,筆者介紹了Dart類的構造方法 帶你Dart帶你Diao之類(一) 這一篇部落格是介紹Dart類的其他內容,主要包括: Getters和Setters 方法 抽象類和抽象方法 隱式介面 繼承 列舉 mi
帶你Dart帶你Diao之重要概念
核心內容 最基礎的Dart程式 Dart一些重要的概念 KeyWord(關鍵字) Variable(變數) Final&&Const Dart的內建型別 最基礎的Dart程式 先看一個最基礎的Dart程式 void log(Object
【執行力決定命】第2集《老板開始喜歡你,帶著責任心開啟執行力》
執行力、職場、老板、晉升「音頻原文」http://dwz.cn/6sANwk大家好,我是林琳笨,今天和大家一起分享責任心的重要性,為什麽老板喜歡有責任心的人?甚至相親也一定要求對方是一個有責任心的人。所以本期話題我取名《老板開始喜歡你,帶著責任心開啟執行力》責任心的理論定義是:個人對自己和他人、對家庭和集體、
通過位元組碼看原理,帶你去找kotlin中的static方法
kotlin在被欽定為Android的官方開發語言後,越來越多的Android開發者投向kotlin的懷抱。儘管kotlin相容Java,但在使用上還是有很大不同的,就像static關鍵字,我們可以用companion object來替代static,當我們用反射去呼叫時,會發現呼叫時並不像static
《設計模式》之一文帶你理解建造者模式、模板方法、介面卡模式、外觀模式
我的github,到時上傳例子程式碼 https://github.com/tihomcode 《設計模式》之一文帶你理解單例、JDK動態代理、CGLIB動態代理、靜態代理 建造者模式 什麼是建造者模式 建造者模式:是將一個複雜的物件的構建與它的表示分離,使得
給你一個團隊,你怎麼帶?
有人說,管理者面臨的最大問題是:不懂帶團隊!所以,很多管理者往往扮演的是團隊的柺杖、保姆等角色,四處救火,身心俱疲,而整個團隊也缺乏激情,士氣渙散,執行力低下。 帶團隊,不是簡單地發號施令,不是簡單地分解指標,而是一個系統工程。 關於如何帶團隊的1個理念、9個方法,一定會對身為管理者的你有所
史上最全Java面試題(帶全部答案,你可能要收藏!)
原文地址:前幾天,有朋友去面試之前問我關於後端架構相關的問題,但奈於我去年更多的工作是在移動SDK開發上,對此有所遺忘,實屬無奈,後面準備總結下.今天要談的主題是關於求職.求職是在每個技術人員的生涯中都要經歷多次,對於我們大部分人而言,在進入自己心儀的公司之前少不了準備工作,
讀“讓你的軟件飛起來”持續更新代碼運行效率之路
根據 查表 個人 通過 不知道 代碼 時間 方向 詞匯 通過看作者改進代碼運行效率的過程,頗受震撼。以前只是關註一個算法的空間復雜度以及時間復雜度,看到初寫的代碼,就感覺已經沒有可以進行優化的方向了。 但是作者卻采用多種方式,達到了令人驚訝的結果。首先記錄作者的改進的幾
Apache Commons Digester 二(規則模塊綁定-RulesModule、異步解析-asyncParse、xml變量Substitutor、帶參構造方法)
對象 property 解決 space getclass bool trace throw object 前言 上一篇對Digester做了基本介紹,也已經了解了Digester的基本使用方法,接下來將繼續學習其相關特性,本篇主要涉及以下幾個內容: 規則模塊綁定,
String構造方法帶字符編碼集的作用
java charsetjava使用的有unicode默認字符編碼集,所以直接new String("測試".getBytes(),charset)是沒有意義的。在讀取外部數據的時候,才是使用字符編碼集的意義。InputStream is;byte[] b = new byte[is.available()]
java--建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來
題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Person類 class Pe
面向物件——普通方法及構造方法及帶參方法和方法過載
普通方法 類的方法是為了完成某個特定的應用程式功能存在的,我們要實現程式的某些功能的時候,一般都是某些類的功能,比如上一篇中的學生類,有一個展示學生資訊的方法,我們就可以把它放到學生類裡面(因為只要是學生,他就都有這個展示資訊的功能),而方法是有返回值的,也可以沒有返回值,返回型別為void。有返回值的
java--建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來
題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Perso
Java之建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數。
建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 效果如下: 附上程
作為一個類,系統都會自動產生一個不帶引數的構造方法?
首先,這個問題的答案是:錯誤。構造方法是用來建立一個例項的,或者說是建立一個物件。如果類本身沒有寫構造方法,為了讓類能擁有面向物件的能力,那麼開發工具會預設新增一個"不可見的"構造方法,其實就是無參構造方法:class Car { public void color()
Java中 每個類在沒有宣告構造方法的前提下,會自動生成一個不帶引數的構造方法
每個類在沒有宣告構造方法的前提下,會自動生成一個不帶引數的構造方法,如果類一但宣告有構造方法,就不會產生了.證明如下: 例1: class person { person(){System.out.println("父類-person");} person(int
Java通過反射獲取帶引數構造方法並使用
package com.sanmao10; import java.lang.reflect.Constructor; public class test2 { /** * ###27.05_反射(通過反射獲取帶參構造方法並使用) *
為何在一個類中定義了帶引數的構造方法的時候,需要把無參構造方法定義一下
class TestA{ public TestA(String s) { System.out.println("A"); System.out.println(s); }}class TestB extends TestA{