程式架構
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%