第二部分:Kotlin基础
前言:这一章我们将学习Kotlin基本要素:变量、函数和类;Kotlin中的控制结构;智能转换;Kotlin把类型检查和转换合并成一次操作,最后我们会学习异常。
目录
一、函数和变量
函数:
fun max(a:Int,b:Int):Int{
return if (a>b) a else b
}
可见,函数声明是由fun关键字开始,其后就是函数名,括号内是参数列表,冒号后面是返回值。在Kotlin中if语句是有结果的表达式,而Java中if是语句,没有返回结果,类似于Java中(a>b?a:b),以上函数还可以更简单:
fun max(a:Int,b:Int):Int = if (a>b) a else b
val和var:不可变类型和可变类型:
- val:相当于Java中final变量
- var:相当于Java中非final变量
注意:虽然val引用自身是不可改变的,但是他指向的对象是可以改变的:
val languages = arrayListOf("java")
languages.add("Kotlin")
二、类和属性:
在Kotlin中public是默认可见性
class Person(var name:String,val age:Int?=null)
基本上在你声明的时候就已经自动生成了访问器(只读为getter,可读可写为getter/setter)
自定义访问器:
class Rectangle(var width:Int,var height:Int){
val issquare:Boolean
get() {
return width==height
}
}
三、枚举类型:
//简单枚举类型
enum class Season{
SPRING,SUMMER,AUTUMN,WINTER
}
//带属性的枚举类型
enum class Season2(val temp:Int){
SPRING(10),SUMMER(30),AUTUMN(20),WINTER(-10)
}
//带方法的枚举类型
enum class Season3{
SPRING{
override fun getSeason(): Season3 = SPRING
},
SUMMER{
override fun getSeason(): Season3 = SUMMER
},
AUTUMN{
override fun getSeason(): Season3 = AUTUMN
},
WINTER{
override fun getSeason(): Season3 = WINTER
};
abstract fun getSeason():Season3
}
fun main(args: Array<String>) {
val season = Season.values()
season.forEach { season:Season -> println(season) }
}
四、when处理枚举类型:
fun getSeason(season: Season) =
when (season){
Season.SPRING -> "spring"
Season.SUMMER -> "sunmer"
Season.AUTUMN -> "autumn"
Season.WINTER -> "winter"
}
注意:在when中可以使用任意对象,比Java中switch语句强大得多,when还可以不带参数:
fun getSeason(season: Season) =
when {
season==Season.SPRING -> "spring"
season==Season.SUMMER -> "sunmer"
season==Season.AUTUMN -> "autumn"
season==Season.WINTER -> "winter"
else -> throw Exception("other")
}
五、智能转换:合并类型检查和转换
例如计算(1+2)+4,把他们储存在一个树状结构中,叶子为Num类型,节点为Sum类型,Sum和Num同时实现一个接口Expr,此接口的唯一目的就是提供公共类型
fun eval(e:Expr):Int{
if (e is Num){
val n = e as Num
return n.value
}
if (e is Sum){
val sum = e as Sum
return eval(sum.left)+ eval(sum.right)
}
throw Exception("ex")
}
用when重构上述代码:
fun eval2(e: Expr):Int =
when(e){
is Num -> e.value
is Sum -> eval2(e.left)+ eval2(e.right)
else -> throw Exception("ex")
}
六、异常:
和Java不同的是,Kotlin中不必使用new关键字来创建异常实例,同时Kotlin中throw是一个表达式,有返回值:
var num = 50
val result =
if (num in 1..100){
num
}else{
throw Exception("exception")
}
- kotlin中的异常处理和java处理相似,除了Kotlin不要求你声明函数可以抛出的异常。
- 如果一个try代码块执行一切正常,代码块中最后一个表达式就是结果。
- 如果捕获到一个异常,那么cache代码块中最后一个表达式就是结果。