前言
本人主要學習android開發,之前一直用的編程語言是java。Google在2019年的I/O大會上宣佈Kotlin已經成爲Android開發的第一語言,更加推薦使用Kotlin來編寫Android應用程序。說實話,我剛開始是有點抵觸情緒的,哎,java寫的好好的,又得去學習新的Kotlin語法,太難了。但是沒辦法,總得擁抱變化吧。那就學咯,在此記錄下Kotlin的語法,方便自己查閱,也方便廣大網友查閱。打算分爲兩篇寫,一篇是基本語法,一篇寫一些高級用法吧。下面先來第一篇。
1. 變量
val:申明一個不可變的變量 val a = 10
var:申明一個可變的變量 var b = 20
2. 函數
語法規則如下:
fun methodName (param1:Int, param2:Int):Int{
return 0
}
3. if語句
跟java語法類似,下面演示寫一個函數返回兩個參數中的最大值
fun largeNumber(num1:Int,num2:Int)=if(num1>num2) num1 else num2
4. when語句
kotlin 語句比java的switch語句好用些
fun getScore(name:String)=when (name){
"Tom" ->86
"Jim" ->77
"Lily" ->95
else ->0
}
5. 循環語句
(1)while循環和java一樣,並無特殊
(2)for循環花樣多一些
for(i in 0..10){ //打印0到10
println(i)
}
6. 類與對象
class Person{
var name=""
var age=0
fun eat(){
}
}
//實例化
val p=Person()
7. 類的繼承
kotlin類默認不可繼承,要被繼承得在類前面申明open
open class Person{
//do something
}
Student類繼承Person,用:修飾符
class Student:Person(){
}
8. 構造函數
kotlin中有主構造函數和次構造函數,主構造函數沒有函數體,可以用init塊做一些初始化操作,如下:
class Student(val sno:String,val grade:Int):Person(){
init{
println("sno is"+sno)
}
}
由於kotlin提供一個給函數設定參數默認值的功能,一定程度上可以代替次構造函數,所以次構造函數一般不會用到(次構造函數通過constructor關鍵字來定義)
9. 接口
interface Study{
fun readBooks()
fun doHomework()
}
接口的實現:
class Student(val sno:String,val grade:Int):Person(),Study{
init{
}
override fun readBooks(){
}
override fun doHomeworks(){
}
}
注意接口中的方法可以有默認實現
10. 數據類和單例類
data class Student(val sno:String,val grade:Int)
data關鍵字表明這個類是一個數據類,kotlin會自動生成equals()、hashCode()、toString()等固定且無實際意義的方法
object Singleton{
}
object關鍵字表明這是一個單例類
11. 集合類
val list1=listOf("Apple","Banana","Orange","Pear")
for(fruit in list1){
println(fruit)
}
val list2=mutableListOf("Apple","Banana","Orange","Pear")
list2.add("Grape")
mutableListOf和listOf的區別是mutableListOf是可變的,所以可以用add方法
類似的,有setOf和mapOf
val set=setOf("Apple","Banana","Orange","Pear")
val map=mapOf("Apple" to 1,"Banana" to 2,"Orange" to 3,
"Pear" to 4)
12. 集合的函數式API
maxBy、map、filter、any、all等
val list1=listOf("Apple","Banana","Orange","Pear")
//簡化版
val maxLengthFruit1=list1.maxBy{it.length}
//原版
val maxLengthFruit2=list1.maxBy({fruit:String->fruit.length})
val newList=list1.filter{it.length<=5}.map{it.toUpperCase()}
val anyResult=list1.any{it.length<=5}//true
val allResult=list1.all{it.length<=5}//false
13. Java函數式API的使用
常用的有以下兩種簡便使用方法
//開線程
Thread{
println("Thread is running")
}.start()
//綁定點擊事件
button.setOnClickListener{
}
14. 空指針檢查
(1)?.操作符表示當對象不爲空時正常調用相應方法,當對象爲空時什麼也不做
if(a!=null){
a.doSomething()
}
//等價於
a?.doSomething()
(2)?:操作符左右兩邊都接收一個表達式,如果左邊表達式的結果不爲空就返回左邊表達式的結果,否則返回右邊表達式的結果
val c=if(a!=null){
a
}else{
b
}
//等價於
val c=a?:b
(3)!!操作符意在告訴kotlin,我非常確信這裏的對象不會爲空,所以不用你來幫我做空指針檢查了,來看個例子
var content:String?="hello"
fun main(){
if(content!=null){
printUpperCase()
}
}
fun printUpperCase(){
val upperCase=content.toUpperCase()
println(upperCase)
}
上面這段代碼看上去沒啥問題,但實際上編譯不通過。因爲printUpperCase()函數並不知道外部已經對content變量進行了非空檢查,在調用toUpperCase()方法時,還認爲存在空指針風險,因此編譯不通過。解決辦法是用!!操作符
fun printUpperCase(){
val upperCase=content!!.toUpperCase()
println(upperCase)
}
(4)let函數,一個輔助工具,可以做到全局判空,而if不行
fun doStudy(study:Study?){
study?.readBooks()
study?.doHomework()
}
//等價於
fun doStudy(study:Study?){
study?.let{ stu->
stu.readBooks()
stu.doHomework()
}
}
//只有一個參數,可以簡化爲
fun doStudy(study:Study?){
study?.let{
it.readBooks()
it.doHomework()
}
}
15. 字符串內嵌表達式
"hello,${obj.name}.nice to meet you!"
16. 函數的參數默認值
fun main(){
printParams(str="world")
}
fun printParams(num:Int=100,str:String){
println("num is $num,str is $str")
}
更多kotlin語法特性,可以參考另一篇博客
Kotlin語法學習(下)