kotlin 基本語法

      在〈kotlin 基本語法〉中尚無留言

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 版本

安裝時,必需勾選所有選項,安裝後必需重新開機

kotlin_install1

第一支程式

第一次進入, 請選擇 Create New Project

然後左邊選取 Kotlin,右邊 Location 選取專案儲存目錄(E:\kotlin),Name 直接輸入 20240901,最後記得要把 Add sample code 取消掉。

 然後於 src 按右鍵,依序選取 New -> Kotlin File/Class,再選取 File,Name 輸入 main。此時專案下就會多一個 main.kt 的檔案

kotlin_env_6

輸入如下代碼, 並按下執行按鈕, 或於編輯畫面中按下滑鼠右鍵/Run ‘Main.kt’

fun main(args:Array<String>){ 
    println("Hello, 這是我的第一支Kotlin程式") 
}

此時下方視窗即會出現執行的結果

kotlin_env_8

放大字體

請由File/Setting進入, 再選取Editor/General, 然後勾選右邊 Change font size(Zoom) with Ctrl+Mouse Wheel

kotlin_env_5

命令式編譯

下載 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%

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *