2.1 基本要素
- 函數
//一般函數
fun max(a: Int ,b: Int): Int{
return if(a>b) a else b
}
//表達式函數,函數體是單個表達式構成,可以去掉花括號和return語句
fun max(a: Int ,b: Int): Int = if(a>b) a else b
//編譯器會自動分析作為函數體的表達式,并把它的類型作為函數的返回類型
//并且只有表達式函數的返回值可以省略
fun max(a: Int,b: Int) = if(a>b) a else b
- 變量
//如果不指定變量類型,編譯器會自動分析初始化器表達式的值,把值的類型作為變量的類型
//如果變量沒有初始化器,需要顯式地指定它的類型
//可變變量和不可變量
var a: Int = 42
var a = 42
//對應java的final變量
val a = 42
val a: Int = 42
- 字符串模板
//調用的java的StringBuilder對象的方法
val name = "zhangsan"
println("Hello,$name!")
println("Hello,${name}!")
2.2 類和屬性
值對象:只有數據沒有方法的類
class Person(val name: String)
- 屬性
class Person{
//聲明只讀屬性:同時聲明了一個簡單的getter方法
val name :String,
//聲明可寫屬性:同時聲明了getter和setter方法
var isMarried: Boolean
}
- 自定義訪問器
class Person{
val name: String
get(){
println("復寫了get方法")
return name
}
var isMarried: Boolean
get(){
return isMarried
}
set(married : Boolen){
isMarried = married
}
}
- 目錄和包
Kotlin不區分導入的是包還是函數,允許使用import關鍵字導入任何類的聲明,也可以導入頂層函數的名稱。
2.3 枚舉和‘when’
- 枚舉的聲明
enum class Color{
RED,GREEN,BLUE
}
//枚舉類可以有屬性和方法
//如果在枚舉類中定義任何方法,就需要把枚舉常量列表和方法定義用分號分開
//Kotlin唯一必須使用分號的地方
enum class Color(val r: Int,val g: Int,val b: Int){
RED(255,0,0),
GREEN(0,255,0),
BLUE(0,0,255);
fun rgb() = (r*256+g)*256+b
}
使用‘when’處理枚舉類
‘when’結構中使用任意對象
when結構允許使用任何對象作為分支條件使用不帶參數的‘when’
如果沒有給when表達式提供參數,分支條件就是任意的布爾表達式智能轉換:合并類型檢查和轉換
智能轉換:如果你檢查過一個變量是某種類型,后面就不再需要轉化它,可以直接把它當做檢查過的類型使用。
//使用is檢查判斷一個變量是否是某種類型
var name = "我是不是字符串"
name is String
if(name is String){
var n = name as String //顯示地轉換是多余的
name.length //智能地轉換為String類型
}
- 重構:用‘when’代替‘if’
- 代碼塊作為‘if’和‘when’的分支
“代碼塊中最后的表達式作為結果”,在所有使用代碼塊并期望得到一個結果的地方成立
2.4 迭代事物:‘while’循環和‘for’循環
- ‘while’循環
- 迭代數字:區間和數列
‘··’運算符標識區間
val oneToTen = 1··10
//kotlin中的區間是前后閉合的
- 迭代map
- ‘in’檢查集合和區間的成員
2.5 Kotlin中的異常
- ‘try’、‘catch’和‘finally’
kotlin中不區分受檢異常和未受檢異常 - ‘try’作為表達式
小結
- fun關鍵字來聲明函數。
- var和val關鍵字分別用來聲明可變變量和只讀變量
- 字符串模板可避免繁瑣的字符串連接。$變量名或者${}來包圍一個表達式
- 值對象類在kotlin中以簡潔的方式表示
- if是帶返回值的表達式
- when表達式比switch更強大
- 編譯器智能轉換類型
- 區間的創建