0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在dart實(shí)例化類class

CHANBAEK ? 來(lái)源:myfreax ? 作者:myfreax ? 2022-12-05 16:55 ? 次閱讀

Dart是面對(duì)象編程語(yǔ)言并且是基于mixin的繼承方式。這意味著Dart不能繼承多個(gè)類。

每個(gè)對(duì)象都是class類的實(shí)例,并且除了Null不是對(duì)象之外,其它對(duì)象都是Object派生對(duì)象。

基于Mixin的繼承意味著每個(gè)類只有一個(gè)父類,一個(gè)類可以在多個(gè)類的主體中被重用,但Object對(duì)象除外。

Dart的擴(kuò)展方法 Extension methods使你可以在不改變class類或者創(chuàng)建子類的情況下添加函數(shù)到類class。

在本教程中,我們將會(huì)說(shuō)明如何在dart實(shí)例化類class,打印對(duì)象數(shù)據(jù)類型,初始化實(shí)例變量,訪問(wèn)實(shí)例變量。

Class類的成員

對(duì)象的成員由函數(shù)和數(shù)據(jù),有時(shí)也成為方法與實(shí)例變量組成。當(dāng)你調(diào)用一個(gè)方法時(shí),是在一個(gè)對(duì)象上調(diào)用它。該方法可以訪問(wèn)對(duì)象的功能和數(shù)據(jù)。

你可以使用點(diǎn)符號(hào).訪問(wèn)實(shí)例的變量和方法。當(dāng)訪問(wèn)的屬性可能為null空時(shí),請(qǐng)使用?.代替.

var p = Point(2, 2);

// 訪問(wèn)p對(duì)象y實(shí)例變量.
assert(p.y == 2);

// 在對(duì)象p調(diào)用distanceTo()方法.
double distance = p.distanceTo(Point(4, 4));
// If p is non-null, set a variable equal to its y value.
var a = p?.y;

dart class實(shí)例化

你可以創(chuàng)建一個(gè)對(duì)象使用構(gòu)造函數(shù),構(gòu)成函數(shù)的名稱可以是類名ClassName或者ClassName.identifier。

例如下面的代碼創(chuàng)建Point 對(duì)象,使用Point()Point.fromJson() 構(gòu)造函數(shù)。

你也可以使用可選的new調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象,通常沒(méi)有人會(huì)使用new關(guān)鍵詞創(chuàng)建對(duì)象。

var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});

var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

某些class類會(huì)提供一個(gè)常量構(gòu)造函數(shù),它可用于創(chuàng)建編譯常量。要?jiǎng)?chuàng)建常量構(gòu)造函數(shù),請(qǐng)將const關(guān)鍵詞放在構(gòu)造函數(shù)名稱的前面。

當(dāng)創(chuàng)建兩個(gè)同樣的編譯時(shí)常量,它們的實(shí)例是一樣的。在常量的上下文,構(gòu)造函數(shù)或者字面量可以省略const關(guān)鍵詞。

您可以僅使用一次const關(guān)鍵詞,在變量的前面添加const關(guān)鍵詞創(chuàng)建常量的上下文。

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);

assert(identical(a, b)); // 它們是同一個(gè)實(shí)例
// 這種方式使用非常多的常量關(guān)鍵詞
const pointAndLine = const {
  'point': const [const ImmutablePoint(0, 0)],
  'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};

// 使用const關(guān)鍵詞創(chuàng)建常量上下文
const pointAndLine = {
  'point': [ImmutablePoint(0, 0)],
  'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};

如果常量構(gòu)造函數(shù)在常量的上下文外部并且在調(diào)用的時(shí)候沒(méi)有使用const關(guān)鍵詞,它會(huì)創(chuàng)建一個(gè)非常量的對(duì)象。

var a = const ImmutablePoint(1, 1); // 創(chuàng)建一個(gè)常量
var b = ImmutablePoint(1, 1); // 不會(huì)創(chuàng)建常量

assert(!identical(a, b)); // 兩個(gè)不同實(shí)例

Dart 打印對(duì)象數(shù)據(jù)類型

要在運(yùn)行時(shí)獲得一個(gè)對(duì)象的類型,你可以訪問(wèn)ObjectruntimeType屬性,它會(huì)返回對(duì)象的類型。

要測(cè)試一個(gè)對(duì)象的類型請(qǐng)使用類型測(cè)試操作符,而不是ObjectruntimeType屬性。

產(chǎn)品環(huán)境,測(cè)試對(duì)象類型的語(yǔ)句是object is Typeobject is Type 會(huì)比object.runtimeType == Type更穩(wěn)定。

print('The type of a is ${a.runtimeType}');

// is 
if(a is Stream){
  print
}

實(shí)例變量

class Point {
  double? x; // 聲明instance x,初始值是空null
  double? y; // 聲明instance y,初始值是空null
  double z = 0; // 聲明instance z,初始值是空null
}

在Dart,所有未初始化的實(shí)例變量是的值是空null。所有實(shí)例變量都會(huì)有一個(gè)隱式getter方法*。*

非最終Non-final實(shí)例變量和late final實(shí)例變量即使沒(méi)有被初始化也會(huì)生成一個(gè)隱式的setter方法,更多詳細(xì)的信息請(qǐng)參考Getters and setters。

如果初始化一個(gè)非late實(shí)例變量,值會(huì)在創(chuàng)建實(shí)例的時(shí)候被創(chuàng)建。在late實(shí)例變量初始化之前構(gòu)造函數(shù)和初始化列表會(huì)先被執(zhí)行。

class Point {
  double? x; // 聲明實(shí)例變量 x,初始值是空 null
  double? y; // 聲明實(shí)例變量 y,初始值是空 null
}

void main() {
  var point = Point();
  point.x = 4; // 使用x的setter方法
  assert(point.x == 4); // 使用x的getter方法
  assert(point.y == null); // 值默認(rèn)是null.
}

實(shí)例的變量可以是final,這種情況下final的實(shí)例變量必須初始化。要初始化final, 非late實(shí)例變量。

請(qǐng)使用構(gòu)造函數(shù)的參數(shù)或者使用構(gòu)造函數(shù)的初始化列表。如果你需要在構(gòu)造函數(shù)的主體之后初始化一個(gè)final的實(shí)例變量。

你可以工廠構(gòu)造函數(shù)或者使用late final。在使用late final的時(shí)候要小心,late final沒(méi)有初始化器添加到API。

class ProfileMark {
  final String name;
  final DateTime start = DateTime.now();

  ProfileMark(this.name);
  ProfileMark.unnamed() : name = '';
}

結(jié)論

至此,你已經(jīng)了解dart class的成員組成,dart class實(shí)例化,打印對(duì)象數(shù)據(jù)類型,初始化實(shí)例變量,訪問(wèn)實(shí)例變量。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1916

    瀏覽量

    34381
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61971
  • Class
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    19676
  • Dart
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    1731
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SystemVerilog中的參數(shù)

    類似于聲明一個(gè)參數(shù)的module,我們也可以聲明一個(gè)參數(shù)class。這個(gè)參數(shù)可以用來(lái)實(shí)例不同數(shù)值和類型的對(duì)象。
    發(fā)表于 12-01 09:09 ?2394次閱讀

    何在tc377啟動(dòng)軟件時(shí)檢查SSH實(shí)例的內(nèi)存是否已初始?

    我有一個(gè)關(guān)于 SSH 內(nèi)存初始的問(wèn)題。 問(wèn)題是:如何在 tc377 啟動(dòng)軟件時(shí)檢查 SSH 實(shí)例的內(nèi)存是否已初始? 謝謝。
    發(fā)表于 05-22 06:48

    Altium19如何在Class中創(chuàng)建,并修改其對(duì)應(yīng)走線顏色

    一. 我們?cè)谶M(jìn)行PCB設(shè)計(jì)的時(shí)候,一個(gè)PCB板上的信號(hào)線,電源線,地線等等太多了。那我們給它分成一的,就是我們常說(shuō)的在Class中創(chuàng)建的了。我們創(chuàng)建
    發(fā)表于 11-26 11:26

    如何使用Python的? 優(yōu)勢(shì)有哪些?

    ?! ?.實(shí)例一個(gè)是通過(guò)在名后面加小括號(hào)“()”來(lái)實(shí)現(xiàn)的:  pupil=Student ()  “小學(xué)生”是“學(xué)生”這個(gè)的一個(gè)實(shí)例。
    發(fā)表于 07-30 18:08

    請(qǐng)問(wèn)如何在Vivado項(xiàng)目中實(shí)例hdl系統(tǒng)生成器輸出的多個(gè)實(shí)例

    嗨,如何在Vivado項(xiàng)目中實(shí)例hdl系統(tǒng)生成器輸出的多個(gè)實(shí)例?在vivado項(xiàng)目中很容易實(shí)例
    發(fā)表于 07-31 10:38

    何在VHDL代碼中實(shí)例LVDS緩沖區(qū)嗎?

    嗨,我正在為VC707eval板實(shí)現(xiàn)一個(gè)簡(jiǎn)單的VHDL程序,并且很難使用系統(tǒng)時(shí)鐘。時(shí)鐘是LVDS 200 Hz時(shí)鐘。我在XDC文件中定義了SYSCLK_P / _N引腳。需要在代碼中實(shí)例差分輸入和輸出緩沖區(qū)。你知道如何在VHD
    發(fā)表于 08-14 09:08

    加載的時(shí)機(jī)和過(guò)程

    加載機(jī)制把class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),準(zhǔn)備,解析,初始,形成可以被虛擬機(jī)直接使用的字節(jié)碼加載的時(shí)機(jī)(觸發(fā)的初始
    發(fā)表于 11-04 06:16

    python的理解與使用

    新式的寫法,與之對(duì)應(yīng)的是 Python 2 的經(jīng)典寫法。3. 如何實(shí)例?定義了之后,就可以通過(guò)下邊的寫法
    發(fā)表于 03-07 16:51

    python的繼承

    ): def __init__(self, name, age, weight, grade):# 調(diào)用父實(shí)例方法People.__init__(self, name, age, weight
    發(fā)表于 03-08 16:40

    D放大器設(shè)計(jì)實(shí)例,Class D amplifier design example

    D放大器設(shè)計(jì)實(shí)例,Class D amplifier design example 關(guān)鍵字:D放大器,D
    的頭像 發(fā)表于 09-20 19:12 ?1175次閱讀

    C++封裝:的作用域和實(shí)例

    C++封裝:的作用域和實(shí)例
    的頭像 發(fā)表于 06-29 14:28 ?3480次閱讀
    C++封裝:<b class='flag-5'>類</b>的作用域和<b class='flag-5'>實(shí)例</b><b class='flag-5'>化</b>

    box2d.dart Dart版的Box2D

    ./oschina_soft/box2d.dart.zip
    發(fā)表于 05-31 11:29 ?0次下載
    box2d.<b class='flag-5'>dart</b> <b class='flag-5'>Dart</b>版的Box2D

    參數(shù)Class中的靜態(tài)屬性

    static屬性一般是在編譯的時(shí)候就已經(jīng)分配了內(nèi)存,并被這個(gè)的所有實(shí)例共享, 也就是在仿真時(shí)刻0之前就已經(jīng)完成了靜態(tài)屬性的內(nèi)存分配。 但是,參數(shù)中的靜態(tài)屬性可能有所區(qū)
    的頭像 發(fā)表于 12-02 09:17 ?1129次閱讀

    dart語(yǔ)言的變量聲明與初始

    變量是每一們語(yǔ)言的基礎(chǔ),在Dart中所有變量都是對(duì)象,并且都有一個(gè)初始的值null。
    的頭像 發(fā)表于 12-08 16:47 ?1132次閱讀

    何在普通中使用內(nèi)部結(jié)構(gòu)

    訪問(wèn) public void fun ( ) { Inner in = new Inner(); //實(shí)例內(nèi)部類的對(duì)象 in .print(); } //在Outer中的內(nèi)部類 class
    的頭像 發(fā)表于 10-10 16:26 ?347次閱讀