Dart入門04 -- 類盗舰,構(gòu)造函數(shù)猴凹,setter,getter方法

  • Dart 是一種面向?qū)ο蟮恼Z(yǔ)言岭皂,具有類和基于 mixin 的繼承郊霎,每個(gè)對(duì)象都是一個(gè)類的實(shí)例,所有類都來(lái)自Object類爷绘;
  • Dart 使用 class 關(guān)鍵字表示一個(gè)類书劝,對(duì)象具有由函數(shù)和數(shù)據(jù)(分別為方法和實(shí)例變量)組成的成員,我們通過(guò) new 關(guān)鍵字來(lái)創(chuàng)建一個(gè)實(shí)例對(duì)象土至;
  • Dart關(guān)于class類的定義购对,與Java完全類似;
void main(List<String> args) {
  Person person = new Person("yanzi", 33);
  person.run();
  person.eat();
}

class Person {
  //屬性成員
  String name;
  int age;

  //構(gòu)造方法
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  //實(shí)例方法
  void run() {
    print("run");
  }

  void eat() {
    print("eat");
  }
}
  • 構(gòu)造函數(shù):類的構(gòu)造函數(shù)陶因,是用來(lái)創(chuàng)建實(shí)例對(duì)象的函數(shù)骡苞;
默認(rèn)構(gòu)造函數(shù)
  • 當(dāng)class沒(méi)有自定義構(gòu)造函數(shù)時(shí),系統(tǒng)會(huì)默認(rèn)生成無(wú)參的構(gòu)造函數(shù)楷扬;
void main(List<String> args) {
  //無(wú)參構(gòu)造函數(shù)
  Person person = new Person();
  person.run();
  person.eat();
}

class Person {
  //屬性成員
  String name;
  int age;

  //實(shí)例方法
  void run() {
    print("run");
  }

  void eat() {
    print("eat");
  }
}
自定義構(gòu)造函數(shù)
  • 如果class自定義了構(gòu)造函數(shù)解幽,那么默認(rèn)構(gòu)造函數(shù)為Person()就會(huì)被覆蓋,不能使用了烘苹;
void main(List<String> args) {
  Person person = new Person("yanzi", 33);
  person.run();
  person.eat();
}

class Person {
  //屬性成員
  String name;
  int age;

  //自定義構(gòu)造函數(shù)
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  //實(shí)例方法
  void run() {
    print("run");
  }

  void eat() {
    print("eat");
  }
}
  • 上述自定義構(gòu)造函數(shù)躲株,可采用語(yǔ)法糖的簡(jiǎn)潔寫法,如下所示:
void main(List<String> args) {
  Person person = new Person("yanzi", 33);
  person.run();
  person.eat();
}

class Person {
  //屬性成員
  String name;
  int age;

  //自定義構(gòu)造函數(shù) -- 語(yǔ)法糖
  Person(this.name, this.age);

  //實(shí)例方法
  void run() {
    print("run");
  }

  void eat() {
    print("eat");
  }
}
命名構(gòu)造函數(shù)
  • 為構(gòu)造函數(shù)镣衡,定義一個(gè)指定的名稱霜定;
void main(List<String> args) {
  Person person = Person.withNameAndAge("yanzi", 32);
  person.run();
  person.eat();

  Person person1 = Person.fromMap({"name": "li", "age": 30});
  person1.run();
  person1.eat();
}

class Person {
  //屬性成員
  String name;
  int age;

  //命名構(gòu)造函數(shù)
  Person.withNameAndAge(this.name, this.age);

  Person.fromMap(Map<String, dynamic> map) {
    this.name = map["name"];
    this.age = map["age"];
  }

  //實(shí)例方法
  void run() {
    print("run");
  }

  void eat() {
    print("eat");
  }
}
  • withNameAndAgefromMap,都是Person類的命名構(gòu)造函數(shù)廊鸥,有自己獨(dú)有的函數(shù)名稱望浩;
構(gòu)造函數(shù)包含可選參數(shù)
  • 在構(gòu)造函數(shù)中,支持可選參數(shù)惰说,在調(diào)用構(gòu)造函數(shù)時(shí)磨德,對(duì)于可選參數(shù),可傳或者不傳助被;
void main(List<String> args) {
  Person person1 = Person("yanzi");
  Person person2 = Person("sss", age: 22);

  Person person3 = Person.init("aaa");
  Person person4 = Person.init("cccc", age: 26);
}

class Person {
  String name;
  int age;

  //其中age為可選參數(shù)
  Person(String name, {int age}) {
    this.name = name;
    this.age = age;
  }

  //其中age為可選參數(shù)
  Person.init(this.name, {this.age});
}
初始化列表
  • 與C++的語(yǔ)法類似剖张;
  • 初始化列表的使用只能在構(gòu)造函數(shù)中切诀;
  • 在構(gòu)造函數(shù)的小括號(hào)后面揩环,使用冒號(hào): 連接初始化的列表;
main(List<String> args) {
  var p = Person("SF");
  print(p.age);
}

class Person {
  //被final修飾的變量為常量 只能被賦值一次
  final String name;
  final int age;

  //初始化列表與C++語(yǔ)法類似
  //創(chuàng)建對(duì)象時(shí)幅虑,若傳入age,那么就使用傳入的age,如果沒(méi)有傳入age,那么使用默認(rèn)值10丰滑,age為可選參數(shù)
  Person(this.name, {int age}) : this.age = age ?? 10 {
  //在執(zhí)行此大括號(hào)的代碼時(shí),對(duì)象已經(jīng)初始化完畢了
  //必須保證在執(zhí)行此大括號(hào)的代碼之前,final修飾的name與age必須已經(jīng)初始化
  //所以下面代碼報(bào)錯(cuò)
  //this.age = 10;
  }

  //存在局限性 
  //Person(this.name, {this.age = 10});
}
  • Person(this.name, {int age}) : this.age = age ?? 10:初始化列表褒墨,在執(zhí)行大括號(hào)中的代碼之前炫刷,完成對(duì)象的初始化;
  • 可以在構(gòu)造的時(shí)候初始化一些參數(shù)值郁妈,對(duì)于一些final修飾的屬性初始化以后固定值不會(huì)在變浑玛,使用初始化列表,就非常合適噩咪;
重定向構(gòu)造函數(shù)
  • 在一個(gè)構(gòu)造函數(shù)中顾彰,去調(diào)用另一個(gè)構(gòu)造函數(shù),注意??是在冒號(hào)后面使用this進(jìn)行調(diào)用胃碾;
main(List<String> args) {
  var p = Person("SF");
  print(p.age); //22
}

class Person {
  String name;
  int age;

  //調(diào)用自定義構(gòu)造函數(shù)Person._internal
  Person(String name) : this._internal(name, 22);

  Person._internal(this.name, this.age);
}
常量構(gòu)造函數(shù)
  • 在某些情況下涨享,傳入相同值時(shí),我們希望返回同一個(gè)對(duì)象仆百,這個(gè)時(shí)候厕隧,可以使用常量構(gòu)造方法;
  • 默認(rèn)情況下俄周,創(chuàng)建對(duì)象時(shí)吁讨,即使傳入相同的參數(shù),創(chuàng)建出來(lái)的也不是同一個(gè)對(duì)象峦朗,但是若在構(gòu)造函數(shù)前加上const進(jìn)行修飾挡爵,那么可以保證同一個(gè)參數(shù),創(chuàng)建出來(lái)的對(duì)象是相同的甚垦,這樣的構(gòu)造函數(shù)稱之為常量構(gòu)造函數(shù)茶鹃;
main(List<String> args) {
  const p1 = Person("liyanyan");
  const p2 = Person("liyanyan");
  
  //p1與p2是同一個(gè)對(duì)象
  print(identical(p1, p2)); 
}

class Person {
  final String name;

  const Person(this.name);
}
  • 注意常量構(gòu)造函數(shù),只存在一個(gè)final屬性艰亮;
  • 擁有常量構(gòu)造函數(shù)的類中闭翩,所有的成員變量必須是final修飾的;
工廠構(gòu)造函數(shù)
  • Dart提供了factory關(guān)鍵字迄埃,用于通過(guò)工廠去獲取對(duì)象疗韵;
  • 普通的構(gòu)造函數(shù),會(huì)默認(rèn)返回創(chuàng)建出來(lái)的對(duì)象侄非,而工廠構(gòu)造函數(shù)蕉汪,需要手動(dòng)返回一個(gè)對(duì)象
  • 案例代碼:
main(List<String> args) {

  final p1 = Person.withName("liyanyan");
  final p2 = Person.withName("liyanyan");

  print(identical(p1, p2)); //true
}

class Person {
  //對(duì)象屬性
  String name;
  String color;

  //類屬性
  static final Map<String, Person> _nameCache = {};
  static final Map<String, Person> _colorCache = {};

  //工廠構(gòu)造函數(shù)
  //1.根據(jù)key值從緩存中獲取對(duì)象逞怨,存在直接返回者疤,不存在
  factory Person.withName(String name) {
    if (_nameCache.containsKey(name)) {
      return _nameCache[name];
    } else {
      final p = Person(name, "default");
      _nameCache[name] = p;
      return p;
    }
  }

  factory Person.withColor(String color) {
    if (_colorCache.containsKey(color)) {
      return _colorCache[color];
    } else {
      final p = Person("default", color);
      _colorCache[color] = p;
      return p;
    }
  }

  Person(this.name, this.color);
}
  • final修飾變量,保證變量不被胡亂修改叠赦;
setter與getter方法
  • setter方法中驹马,可使用關(guān)鍵字set
  • getter方法中,可使用關(guān)鍵字get糯累;
void main(List<String> args) {

  Person person4 = Person.init("cccc", age: 26);

  person4.setNamee("ssssss");
  print(person4.name);
  print(person4.getNamee());

  person4.name = "gggg";
  print(person4.name);
  print(person4.getNamee());
}

class Person {
  String name;
  int age;

  //其中age為可選參數(shù)
  Person.init(this.name, {this.age});

  //使用set,get關(guān)鍵字的setter算利,getter方法
  set setName(String name) {
    this.name = name;
  }

  String get getName {
    return this.name;
  }

  //不采用set,get關(guān)鍵字的setter,getter方法
  void setNamee(String name) {
    this.name = name;
  }

  String getNamee() {
    return this.name;
  }
}
  • setter與getter方法中使用了setget關(guān)鍵字泳姐,格式如代碼所示效拭;
  • setter與getter方法中可以使用箭頭函數(shù),更加簡(jiǎn)便胖秒;
  • Dart中屬性的get/set方法名是可以任意仍使ⅰ;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扒怖,一起剝皮案震驚了整個(gè)濱河市较锡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盗痒,老刑警劉巖蚂蕴,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異俯邓,居然都是意外死亡骡楼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門稽鞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸟整,“玉大人,你說(shuō)我怎么就攤上這事朦蕴±禾酰” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吩抓,是天一觀的道長(zhǎng)涉茧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)疹娶,這世上最難降的妖魔是什么伴栓? 我笑而不...
    開(kāi)封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮雨饺,結(jié)果婚禮上钳垮,老公的妹妹穿的比我還像新娘。我一直安慰自己额港,他們只是感情好饺窿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锹安,像睡著了一般短荐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叹哭,一...
    開(kāi)封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天忍宋,我揣著相機(jī)與錄音,去河邊找鬼风罩。 笑死糠排,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的超升。 我是一名探鬼主播入宦,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼室琢!你這毒婦竟也來(lái)了乾闰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盈滴,失蹤者是張志新(化名)和其女友劉穎涯肩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巢钓,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡病苗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了症汹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硫朦。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖背镇,靈堂內(nèi)的尸體忽然破棺而出咬展,到底是詐尸還是另有隱情,我是刑警寧澤瞒斩,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布挚赊,位于F島的核電站,受9級(jí)特大地震影響济瓢,放射性物質(zhì)發(fā)生泄漏荠割。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一旺矾、第九天 我趴在偏房一處隱蔽的房頂上張望蔑鹦。 院中可真熱鬧,春花似錦箕宙、人聲如沸嚎朽。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哟忍。三九已至狡门,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锅很,已是汗流浹背其馏。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爆安,地道東北人叛复。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扔仓,于是被迫代替她去往敵國(guó)和親褐奥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容