kotlin基础部分
函数和变量
fun main(args : Array<String>){
println("Hello Kotlin!");
}
以上两行简短的代码可以看到
- 声明一个函数需要使用关键词fun
- 参数类型要写在参数后面
- 函数可以单独存在而不需要在class里面
函数
对于没有返回值的函数,直接使用fun关键词即可;
对于有返回值的函数,在参数列表之后声明返回值类型
fun max(a : Int , b : Int) : Int{
return if(a > b) a else b
}
块主体
如果一个函数拥有大括号,则说这个函数拥有一个块主体
表达式主体
内容部分仅仅由一个表达式组成,可以移除大括号和return声明,使用整个表达式作为函数的主体
fun max(a : Int , b : Int) : Int = return if(a > b) a else b
在这里返回类型也可以省略
原因:对于表达式主体函数来说,编译器能够分析主函数主体的表达式,并使用表达式的类型作为函数返回类型。称为类型推断
<注意>只有表达式函数才能省略返回值
变量
使用var表示变量,一个可变的引用
使用val表示常量,不可变的引用(对应Java中的final变量)
var answer = 42
var answer : Int = 42
val answer = 42
val answer : Int = 42
尽管var关键字允许一个变量改变自己的值,但是类型是固定的,编译器仅仅从初始化的类型推断类型变量
一个val变量必须在定义块执行时被初始化且只能被执行一次
字符串模板
在字符串中通过$字符来引用局部变量,而且表达式是静态检查的,如果去应用一个不存在的变量,代码不会通过编译
类
class Person(var name : String)
仅仅一行,就代替了Java中繁琐的构造函数和get/set方法
在kotlin中,public是默认的可见性
属性
对于Java中的访问权限,在kotlin中通过val和var实现
一个声明为val的属性是只读的,一个声明为var的属性是易变的和可被改变的
class Person(
val name : String,
var isMarried : Boolean
)
枚举和when
enum class Color{
RED,ORANGE,YELLOW
}
可以看出来声明一个枚举类需要使用enum class关键词声明,其中enum又叫做软关键词,放在class之前有特殊含义
enum class Color(val r : Int , val g : Int , val b : Int){
RED(255,0,0),
ORANGE(255,265,0),
YELLOW(255,255,0);//注意这里必须有分号,因为要和函数隔开
fun rgb() = (r * 256 + g) * 256 + b
}
when对应于Java中的switch语法
fun getWhen(color : Color) = when(color){
Color.RED -> "red"
Color.GREEN,Color.BLUE -> "other
}
可以看出,每一行对应于Java中switch以及break
对于多个组合,通过逗号连接
when更强的地方在于它的参数允许任意的对象
智能类型转换:合并类型检查和转换
kotlin·通过is检查一个变量是否为一个指定的类型,通过as进行显示类型转换
在Java中,类型检查之后,如果要使用特定类型访问该变量,则需要进行强制类型转换
在kotlin中,类型检查之后,后续不需要执行类型转换(实际上编译器执行了类型转换),这叫做智能类型转换
当且仅当一个变量在is检查之后不再改变时,智能类型转换才会起作用
while和for循环
while和do-while循环和Java中类似
遍历数字:通过起始值和结束值来操作,中间使用..间隔
var oneToTen = 1..10//闭区间
for (i in 0 until size)//从0打印到size-1
for循环只有for-each模式
for (i in 100 downTo 1 step 2)//从100每次减2直到1
也可以使用in操作符检查一个值是否在某个范围内
遍历映射集
val binaryReps = TreeMap<Char,String>()
for (c in 'A' .. 'F'){
val binary = Integer.toBinaryString(c.toInt())
binaryReps[c] = binary
}
for ((key , value) in binaryReps)//拆箱
println("$key = $value")
异常处理
kotlin没有区分已检查异常和未检查异常,并且没有throws从句在代码中体现
fun readNumber(reader : BufferedReader) : Int ? {
try{
val line = reader.readLine()
return Integer.parseInt(line)
}
catch(e : NumberFormatException){
return null
}
finally{
reader.close()
}
}