1. 程式人生 > >Kotlin搞起來——2.基礎知識

Kotlin搞起來——2.基礎知識

   在上一節中簡單的給大家介紹了下Kotlin的特點,以及結合自己實際專案
中的使用來幫助大家瞭解這門語言,其實真的沒你想象中的那麼難,本文打算
介紹的是Kotlin中基礎相關的一些語法(用法),有個大概印象即可,你寫kotlin
時遇到不會的點,回來這裡檢視即可!對了,差點忘了關於kotlin中很重要的一點:

 

本節關鍵字一覽

  • var:定義變數
  • val:定義常量
  • fun:定義方法
  • Unit:預設方法返回值,類似於Java中的void,可以理解成返回沒什麼用的值
  • vararg:可變引數
  • $:字串模板(取值)
  • 位運算子or(按位或),and(按位與),shl(有符號左移),shr(有符號右移),
    ushr(無符號右移),xor(按位異或),inv(按位取反)
  • in:在某個範圍中
  • downTo:遞減,迴圈時可用,每次減1
  • step:步長,迴圈時可用,設定每次迴圈的增加或減少的量
  • when:Kotlin中增強版的switch,可以匹配值,範圍,型別與引數
  • is:判斷型別用,類似於Java中的instanceof()

1.package打包與import導包


Kotlin中的packageimport與Java中的使用是一樣的,不過kotlin中:

原始檔可以不需要匹配目錄和包,原始檔可以放在任何檔案目錄!”

如果沒有任何包宣告的話,則當中的程式碼都屬於預設包,匯入時包名即為函式名
比如:import shortToast
而如果是在Java中,假如包名和包路徑不相匹配,編譯器是會報不匹配的錯誤的:

 

另外你還可以在匯入類的時候為類設定一個別名,比如:

   

還有,kotlin中因為可以使用擴充套件方法

,所以可以連class和interface都不寫
直接在檔案中寫一堆fun方法!

而關於作用域,Kotlin中和Java是有些許不同的:

  • public:預設,總是可見
  • internal:同模組可見
  • private:聲明範圍與同模組的子作用域可見
  • protected:類似於private,但對子類也可見

注意:Java中不同包名沒有任何直接關係!


2.常量與變數(val與var)

kotlin中使用val關鍵字來宣告一個只讀常量(final,不可修改,定義後,如果
後面修改值的話會報錯的!),而使用var關鍵字來宣告一個變數!

普通的寫法:

 

你還可以連資料型別都不謝,因為Kotlin有:型別推斷(Type inference) 的特性:
可以不指定資料型別,它會自動從後面的語句中推斷出來!比如:

 

還有一點,val定義常量和var定義變數,預設都是private的,比如
定義:val a =123, var b = 321,開啟生成的.class檔案可以看到:

 

如圖,private私有,且預設寫了公有的getter和setter方法。


3.方法定義

kotlin中使用 fun 關鍵字來宣告一個方法,先要說一個返回值:Unit
和Java中的void類似,表示的是:返回一個沒有意義的值,預設,可以不寫!
在方法名後面加一個(),如果需要傳入引數可以寫在這裡!示例如下,

 

另外,如果是可變引數的話,可以使用 vararg 關鍵字修飾,只能一個個傳值,
不能直接使用外部Array,除非使用 ***** 符號表示將Array中所有的元素都當做
引數處理!示例如下:

   

另外,Kotlin中的方法可以直接定義在檔案中,而不需要依賴於任何的類,這個
稱為擴充套件方法;而寫在class或object中的方法則稱成員方法;Kotlin中還有一種
特殊的方法:本地方法,定義在方法內部的方法,可以訪問外部函式的私有成員!

對了,如果沒有訪問控制符修飾的fun預設是public final的!比如:

 

4.字串

首先是字串模板,就是支援用符號來取值,比如上面的pro方法中,

  a和   b可以取得a和b對應的值,上面的程式碼其實還可以寫得更簡潔一些:

 

 

然後kotlin還支援字串遍歷

 

5.資料型別

Kotlin中使用接近於Java的方式(內建型別)來表示數字,但是又不完全相同,
比如沒有隱式轉換!Kotlin中數字相關的內建型別如下:

 

需要注意幾點:

  • 1.沒有自動向上轉型,比如Int轉Long,需要自己調toXxx方法轉
 
  • 2.Long型別結尾必須為大寫的L,不能為小寫,比如1024L
  • 3.字元Char不是Number,用單引號來宣告,比如'c',不能像Java一樣直接拿來當數字使,
    如果你想把Char的值給Int,需要調toInt()方法
  • 4.Boolean的值為true或false
  • 5.Kotlin不支援8進位制,十六進位制0x開頭,二進位制0b開頭
  • 6.位運算子,Java中的與或運算子用:|&,kotlin中使用orand關鍵字來替代
    其他運算子也有分別的關鍵字替代:shl(有符號左移),shr(有符號右移),ushr(無符號右移)
    xor(按位異或),inv(按位取反)

6.陣列

Kotlin中使用 Array 類表示陣列,需注意一點:[]訪問陣列元素在這裡實際上是進行了操作符的
過載,呼叫的其實是Array類的getter和setter方法,但是編譯成位元組碼的時候會進行優化,
變成直接訪問陣列的記憶體地址,所以並不會造成效能損失!

建立陣列

  • 定長陣列:val fixedSizeArray = arrayOfNulls<Int>(10)
  • 空陣列: val empty = emptyArray<Int>()
  • 裝箱操作:val arr = arrayOf(1, 2, 3) //還有其他比如IntArrayOf,BooleanArrayOf等
  • 閉包初始化   ,結果輸出:0123456789

訪問陣列:使用[],如上~

遍歷陣列

 

 

根據下標遍歷

  indices代表下標!範圍:( 0 <= indices < 陣列size)

 


7.流程控制

判斷結構(條件表示式):

kotlin中if-else的使用與Java基本類似,而Java中有條件表示式這種東西:

 

而Kotlin面向表示式,寫法如下:

 

你還可以直接把表示式寫得很騷,比如:返回不同型別:

 

另外,表示式必須有值,如果else不返回東西的話,你需要引入Unit類:

 

還有一點,在if語句塊的最後可以自動返回最後一行表示式的值,而不需要寫return

 

迴圈結構

Kotlin中的while與do-while,break,continue與Java中的類似,不過Kotlin中多了個好玩的東西:
Ranages,包含與範圍有關的函式操作符,使用示例如下:

  • 1.在範圍內與不在範圍內:
 
  • 2.判斷某個字串是否包含某兩個字串中的一個或多個:
 
  • 3.迴圈遍歷的玩法:

前面陣列遍歷我們這樣寫:

 

,輸出:12345678910

你也可以調lastIndex來獲得最後的下標,寫成if(i in 0..array.lastIndex)
如果你不想順著遍歷,想反過來遍歷,可以利用downTo (遞減)關鍵字,從最大值到最小值遞減!

 

輸出:109876543

可能你還想隔著遍歷,比如只遍歷:10,7,4,1,可以用 step (步長)關鍵字!後面跟著的是步長,
比如你可以寫成小數0.1這樣也行,示例:

 

輸出:10963

除此之外,其實還有一個倒序的方法:reversed(),比如下述程式碼:

 

輸出:10987654321

增強版Switch(when語句)

when語句可以匹配型別值和範圍還有引數,而且不用寫break語句,非常可怕!

 

使用示例如下:

匹配值與範圍

 

輸出結果:A

匹配型別(只能匹配變數的型別,或else):

 

輸出結果:是整型

匹配引數

 

:輸出結果:else x= 92


8.異常

Kotlin中所有的Exception都繼承了Throwable,含有一個message且未經檢查。
這表示不會強迫我們在任何地方使用try/catch,而Java中如果某個方法丟擲
了Exception,就需要用try-catch包圍程式碼塊!換一種說法:

Kotlin中沒有檢驗異常!”

而丟擲異常和try-catch-finally和Java中的類似!但是Kotlin中throw和try都是表示式
意味著他們可以賦值給某個變數,這一點在處理邊界問題的時候很有用!

比如

  ,輸出結果:  

 


9.本節小結


本節對Kotlin中的一些基礎知識進行了解讀,包括導包打包常量變數方法定義
字串陣列流程控制異常這個八個常見的知識點,相信你對kotlin的掌握
又更進一步了,本來想把集合也放這一節的,考慮到集合的操作符比較多,
遂放到下一節,敬請期待~


本節參考文獻如下

Kotlin官方文件
kotlin-for-android-developers-zh
Step into Kotlin


修改日誌

  • 2016.11.11 感謝Berial 指出的錯誤:
  • 1.預設的作用域修飾符是public而非internal!
  • 2.Kotlin中表示數字的是內建型別,而非包裝類!


作者:coder_pig
連結:https://www.jianshu.com/p/29c8b5775663
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。