Dart基礎_1

主要講一些注意點,跟主流語言差不多的就不講了。目測0基礎學習Dart的人應該很少甚至沒有吧。主要是移動端開發和前端開發學習。歡迎評論歡迎來撕。

變量

先展示下幾種變量的聲明方式,然后再說下區別

void main() {
  //var 聲明時 不初始化
  var a;
  a = false;
  a = 123;
  a = 'test';
  print(a);
  
  //var 聲明時 初始化
  var b = false;
//  b=123;   編譯器報錯
//  b='test';
  print(b);

  //dynamic
  dynamic c = false;
  c = 123;
  c = 'test';
  print(c);

  //Object
  Object d = false;
  d = 123;
  d = 'test';

  //明確具體類型
  String e = 'test';
  print(e);

}

var

首先要明確的是:Var只是個關鍵字,編譯器會根據賦值反推其聲明的類型

聲明時不進行初始化
 //聲明時 不初始化
  var a;
  a = false;
  a = 123;
  a = 'test';
  print(a);

這個情況,后面變量可以隨意更改指向的對象類型。

聲明時 進行初始
var.png

聲明直接初始化,則變量的能指向的引用類型被固定,之后這個變量就不能指向其他類型對象。

dynamic

先看下與var的區別,它即使是在聲明時進行了初始化,后面還能指向其他類型的對象。如下

  dynamic c = false;
  c = 123;
  c = 'test';
  print(c);

這是為什么呢?

首先dynamic不是關鍵字,它表示一種未知類型,所以它可以表示所有類型
其次 dynamic聲明的變量類型是在運行時才確定,所以編譯器在編譯時不會檢查
個人感覺類似于java中泛型里常用的T,同時它在Dart的常用場景也是泛型。

Object

看下面源碼的注釋,Dart所有對象的基礎類。類似java中的Object

part of dart.core;

/**
 * The base class for all Dart objects.
 *
 * Because Object is the root of the Dart class hierarchy,
 * every other Dart class is a subclass of Object.
.....
 */
@pragma("vm:entry-point")
class Object {
    
    }

那他與dynamic的區別是什么呢?

其實主要是一個是編譯時確定聲明的變量類型,一個是在運行時確定變量類型。

下面演示個例子,一看就了解了:

class Person {
  var age;
}

class Girl extends Person {
  void birth() {
    print('生小孩');
  }
}

void main() {
  canBirth(Girl());
}

void canBirth(dynamic person) {
  person.birth();
}

其中 最后一個scanBirth()方法的參數有好幾種寫法

q.png

因為birth()方法不是Person和Object對象的,所以我們調用編譯器會報錯。此時針對傳入的參數類型不確定,想要這個方法通用,并且不報錯。那么就可以用dynamic了,因為他是運行時才確定變量類型的,所以編譯器在編譯時并不會去檢查它的問題。

使用建議

個人建議:

  • 在知道變量類型的情況下,盡量顯示的聲明變量類型。類似:String a ='hello'; 這樣能省去類型反推
  • 使用Var的時候盡量在聲明時就初始化,這樣聲明后就確定了變量類型
  • 盡量少用dynamic,因為使用它至少編譯器就不能幫你檢查出一些編譯時的錯誤

常量

常量就是聲明初始化后就不能改變,dart中主要通過final和const來修飾常量。
還有就是常量聲明的時候就必須初始化。

![字符串.png](https://upload-images.jianshu.io/upload_images/622557-538b2c6975c54178.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

final

修飾的常量初始化后就不能更改了。它修飾的常量在運行時才生成。

const

const跟final的區別是 它修飾的常量是在編譯時就生成了。

所以正常情況下 const的不能在對象中使用,因為對象實例都是在運行時才創建。如果想在對象中使用const,則需要加static修飾,作為靜態常量使用,這樣就能保證其在編譯時就生成。

區別

  • 常量生成時機不同,const是編譯時,final是運行時
  • const定義的常量會傳遞到期子對象,其子元素也是不可修改的
  • const不會重復定義相同對象
    先代碼驗證下上面說的第二條
void main() {
  final a =[1,2,3];
  print(a);
  a[1]=4;
  print(a);
}

看下輸出結果:


final_test.png

下面我們看下const 修飾List會怎樣

void main() {                           
  const a =[1,2,3];                     
  print(a);                             
  a[1]=4;                               
  print(a);                             
}                                       

看下輸出:


const_test.png

使用final修飾的List里面的參數是可以更改的,const修飾的不能更改

下面再使用const和final分別定義相同的對象,看看他們有沒有重復生成相同對象

void main() {                               
  const a =[1,2,3];                         
  const b =[1,2,3];                         
  print(a.hashCode);                        
  print(b.hashCode);                        
                                            
  final c =[1,2,3];                         
  final d =[1,2,3];                         
  print(c.hashCode);                        
  print(d.hashCode);                        
}                                          
                                            

看下輸出結果


image.png

可以看到const聲明的對象內存中不會重復創建,而final修飾的會

基本數據類型

先講講基本的 numbers ,Strings,;booleans看看于其他語言的卻別

Numbers

在Dart中我們會發現long,float,short 這些數據類型是沒有的。Dart中只有兩種數據類型int和double。

Strings

Dart的字符串類型和Kotlin語言中的基本相同,比如說模板形式

void main() {
  String s ='111';
  print('this is a test : $s}');
}

可以在字符串中使用表達式,用法是這樣的: ${expression}。如果表達式是一個直接調用的,可以省略 {}。 如果表達式的結果為一個對象,則 Dart 會調用對象的 toString() 函數來獲取一個字符串。
還有使用 三個單引號可以寫成帶格式的字符串

void main() {
  String s ='''
     這是一個
     有格式的字符串
    還能換行o
     
  ''';
  print('this is a test : $s}');
}

看下輸出樣式:


字符串.png

還有個比較牛逼的,比如我們在字符中加轉義字符,比如\n正常情況下輸出會換行,但是如果在字符串前加上小r,則會按原來的輸出,看下面例子:

void main() {                       
String s =' 測試下 \n 轉義字符';        
String rs =r' 測試下 \n 轉義字符';      
  print(s);                      
  print(rs);                     
}                                

輸出結果:


r_test.png

Booleans

這個跟java一樣,只有true和false兩個值,OC或者JS的同學可能不適應

后面還有容器的幾種類型 List ,Map 等單獨講。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373