瘋狂kotlin講義連載之Kotlin的基礎類型--變量

不管使用什麼語言編程,總要處理數據,處理數據就須要使用變量來保存數據,形象地看,變量就像一個個小容器,用於「盛裝」程序中的數據。常量一樣也用於「盛裝」程序中的數據,常量與變量的區別是:常量一旦保存某個數據以後,該數據就不能發生改變;但變量保存的數據則能夠屢次發生改變,只要程序對變量從新賦值便可。

1.1 分隔符

Kotlin語言裏的分號(;)、花括號({})、方括號([])、圓括號(())、空格、圓點(.)都具備特殊的分隔做用,所以被統稱爲分隔符。html

1. 分號

與Java不一樣,Kotlin並不強制要求每條語句必須以分號結尾,固然也可使用分號表示語句結束。正如前面程序所看到的,若是單獨一行內只有一條語句,Kotlin容許這條語句不以分號結尾。編程

但若是打算在同一行內書寫多條獨立的語句,則前面語句須要使用分號表示結束。例如以下語句:數組

var name = "fkit"; println(name)app

Kotlin容許一條語句能夠跨多行,例如,以下語句都是正確的:ide

var str = "fkit"函數

// 表達式能夠跨多行post

str +=ui

".org"this

// 調用方法時能夠跨多行url

var hasFk = str

.startsWith("fk")

var st = "fkit"

// 訪問屬性時也能夠跨多行

var len = st

.length

值得指出的是,一個字符串、變量名不能跨多行。例如,下面的Kotlin語句是錯誤的:

// 字符串不能跨多行

var a = "dddddd

xxxxxxx"

// 變量名不能跨越多行

var na

me = "李剛"

不只如此,雖然Kotlin語法容許一行書寫多條語句,但從程序可讀性角度來看,應該避免在一行書寫多條語句。

注意:Kotlin語句能夠跨越多行書寫,但字符串和變量名不能跨越多行。雖然Kotlin語法容許一行書寫多條語句,但從程序可讀性角度來看,應該避免在一行書寫多條語句。

2. 花括號

花括號的做用就是定義一個代碼塊,一個代碼塊指的就是「{」和「}」所包含的一段代碼,代碼塊在邏輯上是一個總體。對Kotlin語言而言,類體部分、枚舉須要放在花括號中定義,方法體也必須放在花括號中定義。除此以外,條件語句中的條件執行體和循環語句中的循環體一般也放在代碼塊裏。

花括號通常是成對出現的,有一個「{」則必然有一個「}」,反之亦然。後面將會詳細介紹花括號分隔符的用法,此處再也不贅述。

3. 方括號

Kotlin的方括號是一個索引運算符,方括號的主要做用是用於訪問數組元素、List集合元素和Map集合元素,方括號一般緊跟數組變量名、List變量名字或Map變量名,而方括號裏指定但願訪問的數組元素、List元素的索引或Map元素的key。

例如以下代碼:

// 下面代碼試圖對名爲a的數組的第四個元素賦值

a[3] = 3

// 下面代碼試圖對名爲scores的字典中key爲Kotlin的元素賦值

scores["Kotlin"] = 92

關於方括號分隔符的用法,後面還會有更進一步的介紹,此處再也不贅述。

4. 圓括號

圓括號是一個功能很是豐富的分隔符,定義函數、方法時必須使用圓括號來包含全部的形參聲明,調用函數時也必須使用圓括號來傳入實參值。不只如此,圓括號還能夠將表達式中某個部分括成一個總體,保證這個部分優先計算。

關於圓括號分隔符在後面還有更進一步的介紹,此處再也不贅述。

5. 空格

Kotlin語言使用空格分隔一條語句的不一樣部分。Kotlin語言是一門格式自由的語言,因此空格幾乎能夠出如今Kotlin程序的任何地方,也能夠出現任意多個空格,但不要使用空格把一個變量名隔開成2個,這將致使程序出錯。

Kotlin語言中的空格包含空格符(Space)、製表符(Tab)和回車符(Enter)等。

除此以外,Kotlin源程序還會使用空格合理地縮進代碼,從而提供更好的可讀性。

6. 圓點

圓點(.)一般用做類、結構體、枚舉、實例和它的成員(包括屬性和方法)之間的分隔符,代表調用某個類或某個實例的指定成員。關於圓點分隔符的用法,後面還會有更進一步的介紹,此處再也不贅述。

1.2 標識符規則

所謂標識符就是用於給程序中的變量、類、枚舉、函數等命名的名字。Kotlin語言的標識符必須以字符(包括Unicode字符)、下畫線(_)開頭,後面能夠跟任意數目的字符、數字和下畫線(_)。此處的字符並不侷限於26個英文字母,能夠包含中文字符、日文字符等。標識符中不能夠包含空格,不能使用Kotlin的硬關鍵字,特定上下文內不容許使用軟關鍵字,標識符的長度沒有限制。

Kotlin語言是區分大小寫的,所以abc和Abc是兩個不一樣的標識符。

使用標識符時,須要注意以下規則。

  •  標識符能夠由字符、數字和下畫線(_)組成,但不能以數字開頭。
  •  標識符不能是Kotlin的硬關鍵字,特殊上下文中不能使用軟關鍵字和修飾符關鍵字,但能夠包含關鍵字。
  • 標識符不能包含空格。
  •  標識符只能包含下畫線(_),不能包含@、#等其餘特殊字符。

1.3 Kotlin的關鍵字

Kotlin語言中有一些具備特殊用途的單詞被稱爲關鍵字(keyword),當定義標識符時,不要讓標識符與關鍵字相同,不然將引發錯誤。例如,以下代碼將會引發錯誤:

// 下面代碼試圖定義一個名字爲class的變量,但class是關鍵字,不能做爲標識符

var class = 2

Kotlin的關鍵字可分爲3類:


Kotlin的關鍵字可分爲3類:

 硬關鍵字:這些關鍵字不管在什麼狀況下都不能用做標識符。

 軟關鍵字:這些關鍵字能夠在它們不起做用的上下文內用做標識符。

  修飾符關鍵字:這些關鍵字也能夠在代碼中用做標識符。

Kotlin的硬關鍵字包括:

  •  as:用於作類型轉換或爲import語句指定別名。
  •  as?:類型安裝的 is used for safe type casts
  •  break:中斷循環。
  • class:聲明類。
  •  continue:忽略本次循環剩下的語句,從新開始下一次循環。
  •  do:用於do while循環。
  •  else:在if分支中使用。
  •  false:Boolean類型中表示假的直接量。
  •  for:用於for循環。
  •  fun:聲明函數。
  •  if:在if分支中使用。
  •  in:在for循環中使用;in還可做爲雙目運算符,檢查一個值是否處於區間或集合內;in還可在when表達式中使用;in還可用於標識一個形參爲傳入參數。
  •  !in:可做爲雙目運算符in的反義詞;!in也可在when表達式中使用。
  •  is:用於作類型檢查(相似Java的instanceof)或在when表達式中使用。
  •  !is:用於作類型檢查(is的反義詞)或在when表達式中使用。
  •  null:表明空的直接量。
  •  object:用於在聲明類時建立它的實例。
  •  package:用於爲當前文件指定包。
  •  return:聲明函數的返回。
  •  super:用於引用父類實現的方法或屬性或在子類構造器中調用父類構造器。
  •  this:表明當前類的對象或在構造器中調用當前類的其餘構造器。
  •  throw:用於拋出異常。
  •  true:Boolean類型中表示真的直接量。
  •  try:開始異常處理。
  •  typealias:用於定義類型別名。
  •  val:聲明只讀屬性或變量。
  •  var:聲明可變屬性或變量。
  •  when:用於when表達式。
  •  while:用於while循環或do while循環。
  • Kotlin的軟關鍵字包括:
  •  by:用於將接口或祖先類的實現代理給其餘對象。
  •  catch:異常處理中用於捕捉異常。
  •  constructor:用於聲明構造器。
  •  delegate: is used as an annotation use-site target
  •  dynamic:主要用於在Kotlin/JS引用一個動態類型。
  •  field: is used as an annotation use-site target
  •  file: is used as an annotation use-site target
  •  finally:異常處理中finally塊。
  •  get:聲明屬性的getter方法或is used as an annotation use-site target
  •  import:用於導包。
  •  init:用於聲明初始化塊。
  •  param:is used as an annotation use-site target
  •  property:is used as an annotation use-site target
  •  receiveris:used as an annotation use-site target
  •  set:聲明屬性的setter方法或is used as an annotation use-site target
  •  setparam:is used as an annotation use-site target
  •  where:用於爲泛型參數的增長限制。
  • Kotlin的修飾符關鍵字包括:
  • abstract:修飾抽象類或抽象成員。
  •  annotation:修飾一個註解類。
  •  companion:用於聲明一個伴生對象。
  •  const:用於聲明編譯時常量。
  •  crossinline: forbids non-local returns in a lambda passed to an inline function
  •  data:用於聲明數據類。 instructs the compiler to generate canonical members for a class
  •  enum:用於聲明枚舉。
  •  external:用於聲明某個方法不禁Kotlin實現(近似於Java的native)。
  •  final:禁止被重寫。
  •  infix:聲明該函數能以雙目運算符的格式執行。
  •  inline tells the compiler to inline the function and the lambdas passed to it at the call site
  •  inner:聲明內部類,內部類能夠訪問外部類的實例。
  •  internal:用於標識被修飾的聲明只能在當前模塊內可見。
  •  lateinit:修飾一個non-null屬性,用於指定該屬性可在構造器之外的地方完成初始化。
  •  noinline turns off inlining of a lambda passed to an inline function
  •  open:修飾類表示該類可派生子類或修飾成員變量該成員能夠被重寫。operator marks a function as overloading an operator or implementing a convention
  •  out marks a type parameter as covariant
  •  override marks a member as an override of a superclass member
  •  private:private訪問權限。
  •  protected:protected訪問權限。
  •  public:public訪問權限。
  •  reified:marks a type parameter of an inline function as accessible at runtime
  •  sealed:聲明一個密封類。
  •  suspend:標識一個函數後Lambda表達式可做爲suspending。
  •  tailrec:修飾一個函數可做爲尾隨遞歸函數使用。
  •  vararg: allows passing a variable number of arguments for a parameter

1.4 聲明變量

Kotlin是強類型的語言,Kotlin要求全部的變量必須先聲明、後使用,聲明變量時必須顯式或隱式指定變量的類型,類型限制了一個變量能被賦的值,也限制了一個表達式能夠產生的值,還限制了在這些值上能夠進行的操做,並肯定了這些操做的含義。

聲明變量須要使用var或val,以下所示:

var|val 變量名 [:類型] [= 初始值]

其中var聲明的變量是值可變的(可被屢次賦值),val聲明的變量是值不可變的(不能被從新賦值).

在上面聲明變量的語法格式中,程序要麼經過「: 類型」的形式顯式指定該變量的類型,要麼爲該變量指定初始值——Kotlin編譯器將會根據該初始值肯定變量的類型,不能聲明變量時既不指定變量類型,也不指定變量初始值。聲明變量時能夠既顯式指定變量的類型,也指定該變量的初始值,但顯式指定的變量類型必須與初始值的類型保持一致。

例如以下代碼。

程序清單:codes\02\2.2\VarTest.kt

public fun main(args: Array<String>) {

// 聲明變量時顯式指定類型

var b : Int

// 聲明變量時指定初始值,編譯器會根據初始值肯定該變量的類型爲String

var name = "crazyit.org"

b = 20 // b的類型是Int(整型),賦值正確

name = "fkit.org" // name類型爲String,賦值正確

name = 12 // name類型爲String,但12爲Int,賦值錯誤

// 聲明變量時既顯式指定類型,也指定初始值

// 顯式指定的類型與初始值的類型一致,聲明變量正確

var age: Int = 25

age = 12 // age的類型是Int,賦值正確

// 聲明變量時既顯式指定類型,也指定初始值

// 顯式指定的類型與初始值的類型不一致,聲明變量失敗

var sun : String = 500

val book = "瘋狂Kotlin講義"

book = "a" // val聲明的變量是不可變變量,不能被從新賦值

}

對上面程序中5行粗體字代碼的解釋以下。

  第1行粗體字代碼聲明變量時只顯式指定了變量的類型,並未指定初始值,所以變量b只能接受Int類型的值。

  第2行粗體字代碼聲明name變量時並未顯式指定變量的類型,但程序爲該變量指定的初始值爲字符串"crazyit.org",所以編譯器能夠肯定該變量的類型爲String,該變量只能接受字符串類型的值。

  第3行粗體字代碼聲明age變量時既指定了該變量的類型爲Int,也指定了該變量的初始值爲25,程序指定的變量類型與變量初始值的類型是一致的,所以程序正確。

  第4行粗體字代碼聲明sun變量時指定了該變量的類型爲String,但程序又嘗試爲該變量指定500做爲初始值,這樣顯式指定的變量類型與變量的初始值類型並不一致,所以這行代碼是錯誤的。

  第5行粗體字代碼使用val聲明瞭不可變的變量,所以該變量不容許被從新賦值,因此接下來爲book從新賦值代碼有錯誤。

使用val聲明的不可變變量其實至關於常量,常量意味着它的值一旦被初始化以後,將不能夠被從新賦值。根據常量所在的位置不一樣,Kotlin的常量分爲2種。

  局部範圍的常量:這種常量容許在聲明時不指定初始值,只要在第一次使用以前指定初始值便可。

  類的常量屬性:這種常量屬性既能夠在聲明時指定初始值,也能夠在類或結構體的構造器中指定初始值。

程序清單:codes\02\2.2\ValTest.kt

fun main(args: Array<String>) {

// 定義常量,沒有顯式指定類型,編譯器根據初始值肯定常量的類型

val maxAge = 120

// 定義常量時,既顯式指定了常量的類型,也指定了常量的初始值

val eduName : String = "瘋狂軟件教育"

// 常量不容許從新賦值,所以下面代碼是錯誤的

// maxAge = 12

// 同時定義多個變量

// 局部範圍的常量,聲明時不指定初始值

val herName: String

}

對上面程序中3行粗體字代碼的解釋以下。

  第1行粗體字代碼聲明常量時只指定了常量的初始值,編譯器將根據初始值來肯定該常量的類型。

  第2行粗體字代碼聲明eduName常量時既顯式指定了該常量的類型,也指定了該常量的初始值。

  第3行粗體字代碼使用val聲明瞭一個String類型的常量,但並未指定初始值——這是由於局部範圍的常量,並不要求在定義時指定初始值,只要在第一次使用以前指定初始值便可。

須要指出的是,因爲Kotlin程序編譯的字節碼必須遵照JVM規範,所以若是直接在Kotlin程序中定義變量、函數,kotlinc會將自動生成一個名爲:文件名首字母大寫+Kt的類,並將變量轉換爲該類的靜態的getter、setter方法(其中val聲明的只有getter方法),函數則轉換爲該類的靜態方法。

注意:當使用kotlinc編譯Kotlin程序所包含的函數、變量時,這些函數、變量都會轉換成該文件對應類的靜態方法。

另有一點須要說明的是:因爲Kotlinc會爲包含函數、變量的Kotlin程序生成額外的類,這就要求咱們不能在該包下重複定義同名的類。例如,咱們定義了一個名字爲ligang.kt的Kotlin程序,且該程序中包含了函數或變量,那麼kotlinc就會自動生成LigangKt類,所以咱們就不能在該包下重複定義LigangKt類。

以上內容節選自《瘋狂Kotlin講義》:一本讓您最直接認識Kotlin的瘋狂講義
本書即將於2017年11月發售 敬請期待
往期連載
相關書籍《瘋狂Android講義》https://item.jd.com/11689014.html
相關文章
相關標籤/搜索