Kotlin 是由俄羅斯聖彼得堡 JetBrains 開發團隊所發展的程式語言,使用跟 Java 相同的 JVM 虛擬機器運行, 其命名來自於聖彼得堡附近的 科特林島。
Kotlin 的橫空出世,於 2017 年被 Google 併購並宣佈成為 Android 官方的開發語言,目地就是要終結 Java 的時代。
kotlin發音
國外正確的發音是 kotlin [‘katlin](科特林),而不是 [‘kotlin](摳特林)
優勢
kotlin 是 Java 與 Python 的混合體,遵循 Java 的機制,語法又跟 Python 很像,可說是二者的混合體,是近代最優良的程式語言。
參考 : https://ithelp.ithome.com.tw/articles/10235987
JDK
JDK 全名為 Java Development kit : Java開發套件
Kotlin 開發還是需使用到 Java JDK,但幾年前 Oracle 開始對企業追討 Java 授權費,所以許多企業紛紛改用 OpenJDK。為了讓 Oracle 從這個地球上消失,也請大家全面改用 OpenJDK。
OpenJDK 官網只提供 Linux 版安裝套件,至於 Windows,早期以開源社群維護的 ojdkbuild 為主,但現在官網上只支援到 JDK 17 (好像停止維護了)。
還好,現在微軟也提供 OpenJDK 免費長期支援(Long-Term Support, LTS)發行版,相容性沒問題,可取代目前市場上其他 OpenJDK 發行版,微軟官網下載網址在 https://learn.microsoft.com/zh-tw/java/openjdk/download 。
因為 ubuntu 24.04 預設安裝 OpenJDK 64-Bit Server VM (build 21.0.4+7-Ubuntu-1ubuntu224.04),為了相容性,也請在 Windows 下請選擇微軟提供的 OpenJDK 21 版本,然後下載 Windows x64 msi。
安裝時,全都使用預設的設定,一路安裝到底即可。安裝好會自動設定系統 path 路徑,我們不必手動設定。請直接打開 DOS 視窗,輸入 java –version,即可看到安裝的版本。
C:\Users\mahal>java --version openjdk 21.0.4 2024-07-16 LTS OpenJDK Runtime Environment Microsoft-9889606 (build 21.0.4+7-LTS) OpenJDK 64-Bit Server VM Microsoft-9889606 (build 21.0.4+7-LTS, mixed mode, sharing) C:\Users\mahal>
微軟 OpenJDK 預設安裝在 C:\Program Files\Microsoft\jdk-21.0.4.7-hotspot\bin
IDE(Integration Development Environment )安裝
Kotlin 的整合開發環境, 以IntelliJ IDEA最為廣泛普及, 請由https://www.jetbrains.com/idea/download/index.html 下載 Community 版本
安裝時,必需勾選所有選項,安裝後必需重新開機。
第一支程式
第一次進入, 請選擇 Create New Project
然後左邊選取 Kotlin,右邊 Location 選取專案儲存目錄(E:\kotlin),Name 直接輸入 20240901,最後記得要把 Add sample code 取消掉。
然後於 src 按右鍵,依序選取 New -> Kotlin File/Class,再選取 File,Name 輸入 main。此時專案下就會多一個 main.kt 的檔案
輸入如下代碼, 並按下執行按鈕, 或於編輯畫面中按下滑鼠右鍵/Run ‘Main.kt’
fun main(args:Array<String>){ println("Hello, 這是我的第一支Kotlin程式") }
此時下方視窗即會出現執行的結果
放大字體
請由File/Setting進入, 再選取Editor/General, 然後勾選右邊 Change font size(Zoom) with Ctrl+Mouse Wheel
命令式編譯
下載 kotlin 編譯器
在DOS模式下,也可以編譯Kotlin,請到如下官網下載編譯程式,目前最新版本為 2.0.20。https://github.com/JetBrains/kotlin/releases
下載 kotlin-compiler-2.0.20.zip 解壓完後,請將 bin 下的目錄設定在系統環境變數 path 中
若是在 ubuntu下, 請使用如下指令
sudo snap install kotlin --classic
編譯
在DOS下 .kt 原始碼的目錄下執行如下指令
cd e:\kotlin\20240901\src
kotlinc main.kt -include-runtime -d main.jar
執行
java -jar main.jar
請注意,命令式編譯時,main 函數必需加入 Array<String> 參數才可以執行
fun main(args:Array<String>){}
程式架構
Kotlin程式碼通常是以package開頭。此package與目錄無關,只是區隔應用程式的名稱而以。接下來為
fun main(){},此為程式的進入點,參數必需為 args: Array<String>
package com.asuscomm.mahaljsp fun main(args: Array<String>){ println("Hello, world"); }
列印
列印訊息有二個方法,print 及 println ,差別在print不會印出換行,加上 ln 就會列印換行符號。
字串相加
二字串使用 “+” 相加可以結合成一個字串,如下
print("單價 : " + price + ", 數量 : " + qty + ", 總價 : " + (price*qty));
上述使用字串相加的方式,會比字串格式化還要雜亂。
指令結尾
C/C++/C#/Java在每行指令的後面,都必需使用 “;” 當結尾。Python及Kotlin則不用,直接使用 enter 當結尾
註解
在程式碼中如果需要註解說明的話,可以使用二種方式
// : 單行註解
/*
這是多行註解
*/
變數
當需要儲存一個資料時,必需向系統要求一個空間,然後給予這個空間一個名字,並指定此空間的資料型態。因此空間內的值可以隨時變化,因此就稱此空間為變數。
Kotlin並沒有基本資料類型,全部都是物件類型的數字,常用的型態有 Byte,Short,Int,Long,Float,Double等
類型 | 長度 | 範圍值 | 無號符 | |
整數 | Byte | 8 | -128~128 | Ubyte |
Short | 16 | -32768~32767 | Ushort | |
Int | 32 | -21億 ~ 21 億 | Uint | |
Long | 64 | -263~263 -1 | Ulong | |
小數 | Float | 32 | 精準到小數第7位 | |
Double | 64 | 精準到小數第15位 | ||
其他 | Char | 2 | ||
Boolean | true/false | |||
String |
常數
常數數字的表示方式如下
Int : 123 (預設為Int)
Long : 123L
16進位 : 0xff
2進位 : 0b01000011
Float : 123.4f
Double : 123.4f, 123.4e10(預設為Double)
常數可以使用底線隔開, 方便閱讀, 如
1_000_000
10_00000_00
變數宣告
使用變數前, 需先進行宣告, 宣告方式為
var 變數名: 型態 = 值 , 如
var i: Int = 100 //宣告並指定值
var i: Int //不指定值
以上, 可以簡化為
var i=10
此時會自動依後面的值自動判定型別. 所以簡化寫法時一定要給值
空值宣告-null
Kotlin就算是數字或小數,都是物件型態。身為物件,就有可能為null。在Kotlin中,預設變數是不可以有空值的,這是為了避開NullPointerException(NPE)的錯誤。但也是可以手動將變數設為null,此時需加上 “?” 符號宣告。
請注意,一但宣告變數可能為null時,就一定要指定型態
var a:Int a=null //此行會出現錯誤 var b:Int? //一定要指定Int型態 b=null //此行正常
可空變數影響的層面非常廣泛,所以本站獨立另外一個章節說明,請參考 空值Null Safety
常數宣告
val 常數名稱: 型態= 值, 如
val PI:Double=3.14159 val COUNT=1
常數可以宣告後不給值,而是在第一次使用前再給值
val PI:Float ............. PI=3.1415926f
運算元與運算子
以下面的式子說明,
c = a / b
其中的 c, a, b 稱為運算元, “=” , “/” 稱為運算子(operator)
這些特殊符號, 共分為如下幾種
指定運算子
指定運算子即 “=”
var a=10
var b=20
var c=a+b
“=”的意思為, 把”=”右邊的值(a+b), 放到左邊(c)
算式運算子
有 + – * / % ++ — , + – * 就不用說明了
/ : 除號, 請注意, 當二個整數相除時, 其結果亦為整數, 請看下代碼
var a=10 var b=6 var c=a/b println(c) 結果 : 1
% 為求餘數的運算子, 如下的代碼, 結果為 4
var a=10 var b=6 var c=a%b println(c)
++, — 為加1與減1, 先看如下代碼
var a=10 println("a++ = " + a++) println("a = " + a) 結果 : a++ = 10 a = 11
結果是不是有點奇怪了!! a++ 不是加1嗎, 為什麼列出來確是 10? 這是因為 a++ 是先處理再加1, 先處理什麼呢? 先把 a 的值交給 print 列印, 然後才加1. 所以第二次列印 a 時, 就變成了 11.
那如果是 println(++a), 結果就是 11 (先加1再處理)
比較運算子
有 >, <=, <, <=, ==, !=, ===
== 是比較二邊的值是否相等
!= 是比較二邊的值是否不相等
=== 是比較二邊是否為同一個位件
邏輯運算子
&& : and
|| : or
型別轉換
var a:Int=10 var b:Int=6 print(a/6) println(a/b)
上面印出的結果, 都是整數1. 若想印出小數呢
第1個print比較好解決, 改成 print(a/6.0f) 即可
第2個print需改成 print(a/b.toFloat())
這二個都是強制轉型的概念
鍵盤輸入
鍵盤輸入有二種, 第一種為readLine()函數, 第二種為Scanner()物件
readLine
宣告為字串時,需寫成如下
var a:String? a=null
readLine()雖然不可能傳回null,但其型態為String,所以必需寫成如下
var price:String?= readLine()//因為readLine()型態為字串,但有可能是null,所以要加"?" //也可精簡成如下 var price:readLine()
readLine()函數所讀取的值為一行字串或null, 所以如果要進行四則運算的話, 就要再進行轉換, 如下所示
fun main(args:Array<String>){ print("請輸入名字 : ") var name= readLine() print("請輸入年齡 : ") var age=Integer.parseInt(readLine()) age=Integer.valueOf(readLine()) }
上述Integer.parseInt(string), 方法裏的參數只能為String.
但Integer.valueOf(arg), 參數可為String或數字
readLine精簡轉換
readLine()讀進來的格式為String型態。當readLine()時,直接按Enter會得到 “” 空字串,所以readLine()不可能得到null。但 readLine()的型態為String?,是可空值型態。所以需在readLine()後面加上 “?” 這個符號. 才可以使用 .toInt() 進行轉換。不過因為readLine()不可能得到null值,所以網路上加上Elvis “?:0” 是多餘的。詳細說明請參照 空值Null Safety 說明。
底下為其精簡語法
var price= readLine()?.toInt()
Scanner
先使用Scanner(System.`in`
)產生keyboard物件. 請注意, Scanner會出現紅線, 請使用 Alt+Enter import java.util.*
然後再使用kb.nextInt()輸入整數, 此時就不需再進行轉換了.
fun main(args:Array<String>){ var kb= Scanner(System.`in`) print("請輸入價格 :") var price=kb.nextInt() print(price) }
格式化列印
請注意, print/println並不支援格式化列印, 格式化列印只能交由字串處理, 再由 print/println列印字串出來.
fun main(args: Array<String>){
var price: Int=10;
var qty: Int=20;
println("單價 %d, 數量 : %d, 總價 : %d".format(price, qty, price*qty));
}
字串模版
所謂的字串模版,就是在字串中可以提取出變數的值。此時變數位於字串中,但變數前面要加 “$”。這招,又是從php學來的。代碼如下
var a=10 var str="a is $a" println(str)
如果有計算式呢? 則需使用${計算式},如下所示
print("請輸入單價 : ")
var price= readLine()?.toDouble()?:0.0
print("請輸入數量 : ")
var qty= readLine()?.toDouble()?:0.0
println("單價 : $price, 數量 : $qty, 總價 : ${price*qty}")
++ — 補充說明
var a=10 a=a+1
上述的 a=a+1, 是將 a 加 1的方法, 那為什麼還要有 a++呢? 這就需從組合語言來看了
a=a+1 | a++ |
mov ax, a mov bx, 1 inc cx, ax, bx mov a, cx |
mov ax, a xinc ax mov a, cx |
需執行 4 個指令 | 只執行3個指令 |
由上可知, a=a+1需執行4個指令, 但 a++只執行3個指令, 其效能可以提高 25%