Dart基礎--Class類及泛型

一.類的組成部分及調用方式

class Person{
  //聲明變量類型
  String name;
  int age;
  String sex;
  //默認構造函數(shù)最初寫法
  Person (String name,int age,String sex){
    print("默認構造函數(shù)函數(shù)體里的打印");
  }
  //默認構造函數(shù)簡寫誓篱,可以使用this(和上面構造函數(shù)二選一抡爹,推薦簡寫)
  Person({this.name,this.age,this.sex});
  //命名構造函數(shù)
  Person.now(){
    print('命名構造函數(shù)now的函數(shù)體打印');
 }
  //類的普通方法(void表示函數(shù)沒有返回值)
  void printInfo(){
    print("類的printInfo方法::${this.name}--${this.age}--${this.sex}");
 }
  //setter方法敢课,關鍵字set聲明的方法,一般用于設置單個屬性值
  set setInfo(String name){
    this.name=name;
  }
  //getter方法负蠕,關鍵字get聲明的方法他托,一般用來獲取類的某些屬性
  get getInfo{
    return "getter方法::${this.name}--${this.age}--${this.sex}";
  }
}

void main(){
  Person p1=new Person('張三',20,'man');//實例并調用類的默認構造函數(shù)
  Person p2=new Person.now();//實例并調用類的命名構造函數(shù)
  p1.printInfo();//調用printInfo方法
  p1.setInfo="李四";//調用set方法重寫屬性
  print(p1.getInfo);//打印get方法拿到的數(shù)據(jù)
}

二.extends繼承礼仗、覆寫父類方法及super關鍵字

//父類 Person
class Person {
  String name;
  int age;
  Person(this.name,this.age);
  Person.now(){
    print('now');
  }
  printInfo(){
    print("父類方法::$name--$age");
  }
}
//子類 Son
class Son extends Person {
  String sex;
  //繼承父類屬性并將實例化時傳來的sex賦值到this.sex
  Son(String name,int age,String sex):super(name,age){
    this.sex=sex;
  }
  run(){
    super.printInfo();//調用父類方法-使用super.方法名()
    print(this.name);//調用父類屬性-使用this.
  }
  @override   //覆寫父類同名方法約定使用@override標注
  printInfo() {
    print("此方法覆寫父類同名方法::$name--$age");
  }
}

void main(){
  Son s1=new Son("王五",23,"女");
  s1.run();
  s1.printInfo();
}

三.abstract抽象類

  • 特點:
    1.使用abstract關鍵字定義一個抽象類
    2.定義方法不實現(xiàn)祸憋,讓子類去實現(xiàn)
    3.不可直接實例抽象類--調用時體現(xiàn)
  • 應用場景:定義一個類的標準会宪,適用于定義接口
abstract class Animal {
  eat();
  run();
}

class Dog extends Animal {
  eat(){
    print('Dog--eat');
  }
  run(){
    print('Dog--run');
  }
}

void main(){
  // var a1=new Animal(); //不可直接實例抽象類
  Dog d1=new Dog();//可以實例繼承抽象方法的子類
  d1.eat();
  d1.run();
}

四.Mixin混入

  • 特點:(配合代碼理解)
    1.作為被Son繼承的mixin類 只可以繼承自Object類 不可繼承自其它類
    2.作為被Son繼承的mixin類 不可有構造函數(shù)
    3.繼承多個類重復的方法肖卧,后面覆蓋前面的處理方式
    4.繼承后的Son子類is類型檢測時 同屬于A,B,Person 結果都為true
    5.mixin不是繼承 不是接口 是新特性
  • 應用場景:可實現(xiàn)多繼承
class Person {
  String name;
  Person(this.name);
  printInfo(){
    print("${this.name}");
  }
}

// class A extends Person{ //錯誤代碼:作為被Son繼承的mixin類 只可以繼承自Object類 不可繼承自其它類
//   A(String name):super(name); //錯誤代碼:作為被Son繼承的mixin類 不可有構造函數(shù)            
//   printInfo(){
//     print("${this.name}");
//   }
// }

class A {
  printInfo(){
    print("A");
  }
}

class B {
  printInfo(){
    print("B");
  }
}

class Son extends Person with A,B {//with后的A蚯窥、B兩個類以mixin形式被繼承
  Son(String name):super(name);
}

void main(){
  Son s1=new Son('我是abc');
  s1.printInfo();//打印字符串B
}

五.接口

abstract class Db1 {
  add();
}

abstract class Db2 {
  save();
}

class Mysql implements Db1,Db2 { //多個接口應用場景 使用implements接口1,接口2......
  @override
  add() {
    print('add');
  }
  save() {
    print('save');
  }
}

void main(){
  Mysql m1=new Mysql();
  m1.add();
  m1.save();
}

六.類設置初始變量值

class Person {
  String name;
  int age;
  Person():name="張三",age=21{

  }
  printInfo(){
    print("${this.name}--${this.age}");
  }
}

void main(){
  Person p1=new Person();
  p1.printInfo();//張三--21
}

七.類的靜態(tài)屬性

//使用static關鍵字聲明的屬性和方法視為靜態(tài)成員
class Person {
  String name;
  int age;
  static String sex="女";
  Person(this.name,this.age);
  printInfo(){
    print(this.name);
  }
  printInfo2(){
    print(sex);//非靜態(tài)方法可以訪問靜態(tài)成員
  }
  static void staticfn(){
    print(name);//靜態(tài)方法不可以訪問非靜態(tài)成員
  }
  static void staticfn2(){
    print(sex);
  }
}

void main(){
  Person p1=new Person("張三",20);
}

八.類的私有屬性

  • 實現(xiàn)私有的條件:
    1.私有成員聲明時變量名前要有_
    2.將帶有私有成員的類分離出去
//存放私有屬性方法的private.dart文件
class Person {
  String name;
  int age;
  String _sex;//私有屬性
  Person(this.name,this.age,this._sex);
  myfn1(){
    print('myfn1');
  }
  _myfn2(){//私有方法
    print('myfn2');
  }
  getSelfValue(){//普通方法拋出私有屬性
    return this._sex;
  }
  getSelfFn(){//普通方法調用私有方法
    return this._myfn2();
  }
}
//要調用私有成員的文件
import 'libs/private.dart';
void main(){
  Person p1=new Person("張三",20,"男");
  //實例可以訪問普通屬性塞帐、方法
  print(p1.name);
  p1.myfn1();
  //實例不可以訪問私有屬性拦赠、方法
  // print(p1._sex);
  // p1._myfn2();
  //為了可以訪問私有屬性 調用普通方法拋出私有屬性
  print(p1.getSelfValue());
  //為了可以訪問私有方法 調用普通方法拋出私有方法
  p1.getSelfFn();
}

九.泛型

//泛型類
class Person<N,A> {
  N name;
  A age;
  Person(this.name,this.age);
  set setInfo(N n){   //調用此方法必須傳入N類型數(shù)據(jù)
    this.name=n;
  }
  get getInfo{
    return "{name:${this.name},age:${this.age}}";
  }
}

void main(){
  Person p1=new Person<String,int>('張三', 111);
  p1.setInfo='李四';
  print(p1.getInfo);//name:李四,age:111
}
//泛型方法
T getData1<T>(T name){ //校驗返回類型
  return name;
}

getData2<T>(T name){  //不校驗返回類型
  return 123;
}

void main(){
  print(getData1<String>("張三"));
  print(getData2<String>("張三"));
}
//泛型接口
abstract class Person<T> {
  getValue(String key);
  setValue(String key,T value);
}

class Man<T> implements Person<T> {
  @override
  getValue(String key) {
    return null;
  }
  @override
  setValue(String key,T value) {
    print("Man--設置$key=$value");
  }
}

class Woman<T> implements Person<T> {
  @override
  getValue(String key) {
    return null;
  }
  @override
  setValue(String key,T value) {
    print("Woman--設置$key=$value");
  }
}

main(){
  Person p1=new Man<int>();//實例時尖括號傳入類型
  p1.setValue("鍵值", 111);//調用對應方法按照聲明時一致類型傳入即可
}

十.庫的使用

// 1.自定義庫 使用import "libs/selfApi.dart";   直接調用即可
// 2.引入dart的內置庫 使用import "dart:io";     直接調用即可
// 3.引入第三方庫
// (1).找到你要用的庫  https://pub.dev/packages
// (2).創(chuàng)建一個pubspec.yaml配置文件     name--名稱  description--描述   dependencies--依賴的庫:版本
// (3).終端運行pub get下載依賴庫
// (4).看文檔按照指定方式具體使用

卡布奇諾、
\color{green}{\Large\mathbf{如有問題歡迎積極探討}}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末葵姥,一起剝皮案震驚了整個濱河市荷鼠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榔幸,老刑警劉巖允乐,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矮嫉,死亡現(xiàn)場離奇詭異,居然都是意外死亡牍疏,警方通過查閱死者的電腦和手機蠢笋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳞陨,“玉大人昨寞,你說我怎么就攤上這事∠寐耍” “怎么了援岩?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掏导。 經常有香客問我享怀,道長,這世上最難降的妖魔是什么碘菜? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任凹蜈,我火速辦了婚禮,結果婚禮上忍啸,老公的妹妹穿的比我還像新娘仰坦。我一直安慰自己,他們只是感情好计雌,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布悄晃。 她就那樣靜靜地躺著,像睡著了一般凿滤。 火紅的嫁衣襯著肌膚如雪妈橄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天翁脆,我揣著相機與錄音眷蚓,去河邊找鬼。 笑死反番,一個胖子當著我的面吹牛沙热,可吹牛的內容都是我干的。 我是一名探鬼主播罢缸,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼篙贸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枫疆?” 一聲冷哼從身側響起爵川,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎息楔,沒想到半個月后寝贡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扒披,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年圃泡,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎碍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡洞焙,死狀恐怖蟆淀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情澡匪,我是刑警寧澤熔任,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站唁情,受9級特大地震影響疑苔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜甸鸟,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一惦费、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抢韭,春花似錦薪贫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鳍贾,卻和暖如春鞍匾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骑科。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工橡淑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咆爽。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓梁棠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伍掀。 傳聞我的和親對象是個殘疾皇子掰茶,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容

  • 面向對象編程(OOP) 在前面的章節(jié)中,我們學習了Kotlin的語言基礎知識盐碱、類型系統(tǒng)把兔、集合類以及泛型相關的知識沪伙。...
    Tenderness4閱讀 4,444評論 1 6
  • 一:java概述:1,JDK:Java Development Kit县好,java的開發(fā)和運行環(huán)境围橡,java的開發(fā)工...
    ZaneInTheSun閱讀 2,654評論 0 11
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,228評論 0 2
  • 面向對象主要針對面向過程缕贡。 面向過程的基本單元是函數(shù)翁授。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,057評論 0 4
  • 一、基礎知識:1晾咪、JVM收擦、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,383評論 0 4