那些你不知道的Dart細節之變量(一)

前言

好久沒寫Flutter了,之前接觸Flutter還是爲了玩一玩,看着這樣一個新的、好評如潮的跨平臺技術,覺得是該玩一玩了,之前的RN就沒玩就要涼了,畢竟RN不是Google的親兒子,但是Flutter是啊,而且Dart也是啊。

未來的幾篇文章準備寫一個Flutter的專題,最起碼要把之前忽略的一些細節都給補上。好了,廢話不多說,下面直接開始。

那些你不知道的Dart細節之變量

那些你不知道的Dart細節之內置類型

那些你不知道的Dart細節之函數(方法)

那些你不知道的Dart細節之操作符、流程控制語句、異常

那些你不知道的Dart細節之類的點點滴滴

那些你不知道的Dart細節之泛型和庫

Hello World

學習一門語言一般都要從打印“Hello World”開始,那麼就來看一下在Dart中應該怎樣打印:

void main(){
  print("Hello World");
}

和Java類似,Dart執行也需要一個main方法,打印就要比Java稍微簡單點了,直接進行Print就可以了。這裏需要注意的是:方法如果沒有返回值的情況下可以省略void

變量的聲明

真正要進入主題了。。。在Dart中變量的聲明有三個關鍵字:var、dynamic和Object,三個關鍵字的使用情況各有千秋。下面來分別說一下:

var

首先說一下var關鍵字,瞭解過Kotlin的應該對這個關鍵字很熟悉,在Kotlin中var表示一個可變的變量(val表示不可變的,相當於final,這裏不贅述),在Dart中,var如果沒有初始值,可以變成任何類型,但如果var有初始值,那麼類型將被鎖定。這是什麼意思呢?看一下下面這段代碼你就明白了:

main(){
  //print("Hello World");
  var data;
  data = 'zhujiang';
  data = 123;
  print(data);
}

var在沒有初始值的時候是可以隨意指定類型的,例如上面的代碼,可以賦值爲字符串,也可以賦值爲int。這裏要注意:Dart中字符串可以使用單引號也可以使用雙引號。

上面代碼沒有賦初始值,下面賦初始值再看一下:

main(){
  //print("Hello World");
  var data = 1;
  data = 'zhujiang';
  data = 123;
  print(data);
}

在這裏插入圖片描述

大家可以看到,如果有初始值,就不可以改變類型了,正好印證了上面我們所說的類型被鎖定。

Object

這個關鍵字大家應該都很熟悉,Java中的所有對象的父類就是Object。在Dart中dynamic指動態類型,會在編譯階段檢查類型。Object和var不同,即使賦了初始值,也同樣可以指定別的類型:

  Object data2 = 1234;
  data2 = 'dongnao';
  print(data2);

上面所說的會在編譯階段檢查類型指的是如果你調用一個本身沒有的方法,可以直接報紅,提醒你編寫錯誤(var也是在編譯階段檢查類型)。

dynamic

我在學習Dart之前沒有在別的語言見過這個關鍵字,對我而言比較陌生,這個關鍵字和Object非常相似,唯一的區別就是在編譯階段不檢查類型。和Object恰恰相反,如果你調用一個本身沒有的方法,不會報錯,但是當你運行的時候纔會拋異常。

變量的默認值

這個本來不想說的,但是發現和之前所學的不太一樣,還是說一下吧。

在Dart中,沒有初始化的變量自動獲取一個默認值爲null

一切皆對象,對象的默認值爲null

只要記着上面兩句話就可以了,不要被之前的Java所禁錮,比如之前的Boolean值默認會是false,但是在Dart中的bool值默認也是null,記着,一切皆對象,對象的默認值爲null

變量 final和const

final大家很瞭解,Java中經常使用,const相對就比較陌生了,下面說一下他們的共同點:

  • 聲明的類型可省略

      final fVariable1 = 'zhujiang';
    //  final String fVariable1 = 'zhujiang';
      const cVariable1 = 'zhujiang';
    //  const String cVariable1 = 'zhujiang';
    
  • 初始化後不能再賦值

    fVariable1 = 'demo';
    cVariable1 = 'demo';
    

    上面初始化之後,這裏就不可以賦值了,如果賦值即會報錯

  • 不能和var同時使用

    final var fVariable1 = 'zhujiang';
    const var fVariable1 = 'zhujiang';
    

    和var同時使用的話也會報錯。

下面再看一下他們的不同點:

  • 類級別常量,使用static const

    static const int monday = 1;
    

    這裏大家可以參照一下系統中的類,例如DateTime。

  • const可使用其他const 常量的值來初始化其值

    const width = 100;
    const height = 100;
    const square = width * height;
    
  • 使用const賦值聲明,const可省略

    const List clist = [1, 2, 3];
    //  const List clist = const [1, 2, 3];//dart 2之前,const賦值必須用const聲明
    
  • 可以更改非final、非const變量的值,即使曾經具有const值

    var varList = const [1, 2, 3];
    final finalList = const [1, 2, 3];
    const constList = [1, 2, 3];
    varList = [1];
    //  constList = [1];
    //  finalList = [1];
    
  • const導致的不可變性是可傳遞的

    final List ls = [1, 2, 3];
      ls[1] = 4;
      print(ls);
      const List ls1 = [1, 2, 3];
    //  ls1[1] = 4;
    
  • 相同的const常量不會在內存中重複創建

      final finalList1 = [1, 2];
      final finalList2 = [1, 2];
      print(identical(finalList1, finalList2)); //identical用於檢查兩個引用是否指向同一個對象
    
      const constList1 = [1, 2];
      const constList2 = [1, 2];
      print(identical(constList1, constList2)); 
    

    上面代碼的運行結果是false和ture,也印證了上面所說的。

  • const需要是編譯時常量

    final DateTime finalDateTime = DateTime.now();
      //  const DateTime constDateTime = DateTime.now();//DateTime.now() 是運行期計算出來的值
    

總結

本篇文章簡單說明了在Dart中變量的一些細節問題,還有大家在編碼過程中需要注意的問題。下一篇文章講解一下Dart中的內置類型,希望大家能夠喜歡,對大家如果有幫助的話,歡迎點贊關注,如果有異議,可以留言進行討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章