kotlin是我學習的第四門語言了(c,JavaScript,Java),目前初學的感覺,他和JavaScript是差不多的。作爲谷歌的親兒子,還是可以認真學習下的,相信其他的google出品的如go應當也是差不多的
語言特點
- 無需分號結尾語句
- 自動類型推測
- 當一個引用可能爲 null 值時, 對應的類型聲明必須明確地標記爲可爲 null。
基礎語法
包
- 定義
package my.example - 導入
import my.demo.*
與Java不同,目錄與包的結構無需匹配:源代碼可以在文件系統的任意位置。
程序入口(main方法)
fun main() {
println("Hello world!")
}
變量
var a:Int=1
常量
val a:Int
a = 1
const
未被const修飾的屬性只能被 get of set 方法調用,而不能直接調用。而const修飾的屬性是可以被直接調用的,實際上是等同於Java中的 public static final。
const 只允許在top-level級別(file 級別)和object中聲明
函數
關鍵字 fun
基本結構:
fun + 函數名+參數列表+返回值類型(可不加,默認爲Unit類似void)
注意
1 函數可只由一條語句構成,這是一種簡寫的狀態,js中也有類似寫法,如:
fun hasPrefix(x:Any) = x is String
fun hasPrefix(x:Int):Int = if(x > 2) x else 2
fun hasPrefix(x:Any) = when(x){
is String -> true
else -> false;
}
字符串拼接
使用+變量名,或${方法調用}
NULL檢查機制
我想這裏其實是一個很好的設計,很好的對引用的對象如變量,函數返回值在取Null值得行爲這一層面上進行了分類。
- 允許爲空 + ?,若爲空,那麼此條表達式不做處理直接返回
- 不允許爲空 + !!,爲空則拋出異常 kotlin.KotlinNullPointerException
類型檢測及自動類型轉換
個人覺得這是個很巧妙的設計,雖然還不知道有什麼用…總的來說,kotlin可以使用is或 !is 關鍵字判斷引用類型,類似於Java的instance of,巧妙的是,如果成功的is了,或者邏輯上能夠縮小引用的類型範圍了,那麼會自動轉型成對應的類型。
example:
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 做過類型判斷以後,obj會被系統自動轉換爲String類型
return obj.length
}
//在這裏還有一種方法,與Java中instanceof不同,使用!is
// if (obj !is String){
// // XXX
// }
// 這裏的obj仍然是Any類型的引用
return null
#### 區間範圍
這對我是一個全新概念,表示一個區間範圍(等差數列集合),參考:
https://www.kotlincn.net/docs/reference/ranges.html
只能用例子實驗了:
for(i in 1..10) {
print(i.toString()+" - ")
}
println()
for(i in 10 downTo 1) {
print(i.toString()+" - ")
}
println()
for(i in 1..10 step 2) {
print(i.toString()+" - ")
}
println()
for(i in 10 downTo 1 step 2) {
print(i.toString()+" - ")
}
條件語句
與其他的語言中的if使用所不同的是,我們也可以把 IF 表達式的結果賦值給一個變量。因此kotlin裏是沒有三元操作符的,完全可以通過if else條件語句替代。需要注意的是,需要換行
code
fun main() {
var a:Int = 3;
var b:Int = 2;
var c = if(a > b) {
println("i choos a")
a}
else {
println("i choos b")
b}
println(c)
分支語句
在kotlin中使用when替代switch
fun main() {
var num:Int = 3;
when(num) {
3 -> println(3333)
2 -> println(2222)
}
}
值得注意的是,他與switch又不是相同的,在我看來算是一個優化版的switch了,如下:
public static void main(String[] args) {
int num = 3;
switch (num){
case 3: {
System.out.println(3333);
}
case 2: {
System.out.println(222);
}
}
}
Java代碼會輸出 3333 2222。其實一直以來,我就覺得switch中需要額外手動break就是一個過度設計,kotlin解決了這個問題,實際上他更加體現了分支這個詞的含義;
- 無需break判斷的主語,如果沒有傳入參數,那麼則需要我們自行確定主語如:
fun hasPrefix(x:Any) = when(x){
is String -> true
else -> false;
}
等於
fun hasPrefix(x:Any) = when {
x is String -> true
else -> false;
}
- 不一定需要傳入參數,如果傳入了參數假設是x,那麼x默認爲條件
循環語句
for循環
for可分爲2種:
- 基於迭代器:
針對collection集合的遍歷將會使用collection內置的iteator迭代器 - 遍歷數組索引