總結(jié)一下基礎(chǔ)的寫法,方便自己快速的回顧猛铅。
一揖赴、 變量
在 Kotlin 中所有的變量都是不允許為 null 的。
空安全設(shè)計
但是實(shí)際場景是需要一些變量在聲明的時候初始值是 null滞欠。可以如下聲明:
class User{
var name : String? = null
}
Kotlin中專業(yè)術(shù)語:可空類型 肆良。
可空類型變量調(diào)用之后會導(dǎo)致空指針異常筛璧,編譯器會不通過編譯。兩種避免這種情況的寫法:
//第一種寫法, 編譯器會做一次非空確認(rèn)惹恃, safe call
var view? = null
view?.setBackgroundColor(Color.RED)
//第二種寫法夭谤,堅(jiān)定變量絕對不為空,實(shí)際效果就和 Java 的一樣
view !!.setBackgroundColor()
延遲初始化
顧名思義巫糙,直接看如何寫:
lateinit var view: View
override fun onCreate(...) {
view = findViewById(...)
}
類型推斷
做為靜態(tài)語言的Kotlin朗儒,可以在寫變量的時候不用寫變量類型。
var name = "qhh"
val 和 var
var :可讀寫變量
val :只讀變量参淹,只能賦值一次醉锄。
二、函數(shù)
函數(shù)聲明
fun getAddress(name : String): String{
}
無返回值的寫法:
fun setAddr(): Unit {}
//或者省略 Unit
fun setAddr(): {}
函數(shù)參數(shù)的注意點(diǎn)浙值。參考拋物線的總結(jié)
// ??可空變量傳給不可空參數(shù)恳不,報錯
var myName : String? = "rengwuxian"
fun cook(name: String) : Food {}
cook(myName)
// ??可空變量傳給可空參數(shù),正常運(yùn)行
var myName : String? = "rengwuxian"
fun cook(name: String?) : Food {}
cook(myName)
?
// ??不可空變量傳給不可空參數(shù)开呐,正常運(yùn)行
var myName : String = "rengwuxian"
fun cook(name: String) : Food {}
cook(myName)
getter / setter 函數(shù)
var name = "qhh"
get(){
return field + " 666"
}
set(value){
field = " we " + value
}
val name = "qhh"
get(){
return field + " 666"
}
field 相當(dāng)于每個 var 中的內(nèi)部變量
三妆够、 類型
基本類型
Kotlin中基本類型和Java的相差不多。但是也是有區(qū)別的地方负蚊。
1神妹、Int類型裝箱
Kotlin裝箱時根據(jù)場景來決定。
var a: Int = 1 // unbox
var b: Int? = 2 // box
var list: List<Int> = listOf(1, 2) // box
裝箱的過程是耗費(fèi)性能的家妆,所以盡可能的使用不可空變量鸵荠。
2、數(shù)組的寫法區(qū)別
Kotlin中數(shù)組的寫法:(不裝箱)
var array: IntArray = intArrayOf(1, 2)
使用不可空變量和IntArray等數(shù)組類型伤极,都是不裝箱的
四蛹找、類和對象
類的構(gòu)造函數(shù)
1、主構(gòu)造函數(shù)
主構(gòu)造函數(shù)的書寫方式一:
class Student constructor(name: String)
constructor 可以省略哨坪,但是在有可見性修飾符修飾以及注解則不可以省略庸疾。
主構(gòu)造函數(shù)中的參數(shù),可以在 init 函數(shù)塊中進(jìn)行相關(guān)業(yè)務(wù)邏輯当编。
class Student constructor( name: String){
val TAG = "Student"
init {
Log.d(TAG,"name is $name")
}
}
2届慈、次構(gòu)造函數(shù)
class Person {
var firstName: String
constructor(name: String){
firstName = name
}
}
3、構(gòu)造函數(shù)的委托機(jī)制
通過 this 實(shí)現(xiàn),有點(diǎn)類似 Java 中的 super
class Student constructor( name: String){
var studentName = name
var studentAge: Int = 0
init {
Log.d("qhh","name is $name")
}
constructor(age: Int,name: String) : this(name) {
studentAge = age
}
}
初始化代碼塊金顿,是主構(gòu)造函數(shù)的一部分臊泌,都會在次構(gòu)造函數(shù)之前執(zhí)行,不管有沒有主構(gòu)造函數(shù)都是如此揍拆。
類的繼承以及接口的實(shí)現(xiàn)方式
interface Impl {}
class MainActivity : AppCompatActivity(), Impl {}
Kotlin中類默認(rèn)都是 final 的渠概,不可繼承的。只有添加了 open 的類嫂拴,子類才可以繼承它播揪。
open class Parent {
lateinit var mName: String
open fun setName(name: String): Unit {
println("setName = $name")
mName = name
}
fun work(): Unit {
}
}
子類中覆蓋父類的方法必須使用 override 。
class Children : Parent() {
override fun setName(name: String) {
super.setName(name)
println("children name is $name")
}
}
抽象 abstract 關(guān)鍵字筒狠,在Kotlin中同樣的保留猪狈。
abstract class Base {
abstract fun base() : Unit
}
同樣,在 abstract 類中也可以沒有 abstract 函數(shù)窟蓝。
最終創(chuàng)建類的實(shí)例
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val student = Student("小明")
val person = Person("老劉")
val parent = Parent()
parent.setName("大明")
parent.work()
val children = Children()
children.setName("小黃")
val derive = Derive()
derive.base()
}
}
類型轉(zhuǎn)化
同Java一樣罪裹,子類在實(shí)例的時候是可以賦值給父類變量饱普,反過來則不行运挫。
var parentNew: Parent = Children()
多態(tài)的特性同樣保存,并且轉(zhuǎn)為父類之后套耕,同樣是無法調(diào)用子類中的方法谁帕。這個就涉及到類型的強(qiáng)轉(zhuǎn)。Kotlin中使用到的是 is 和 as 兩個操作符冯袍。
if(parentNew is Children){
parentNew.childWork("work 1")
}
(parentNew as Children).childWork("work 1")
as 配合 匈挖?同時使用,可以處理判斷類型轉(zhuǎn)換的安全問題康愤。
//表示 parentNew 是Children 類的父類或者是Children類儡循,則執(zhí)行childWork,如果不是則不執(zhí)行
(parentNew as? Children)?.childWork("11")
注意: parentNew as? Children 之后是一個可空類型的對象
總結(jié)
在學(xué)習(xí)了之后大致的一個基礎(chǔ)使用的總結(jié)征冷。學(xué)習(xí)過程中在看的是 Kotlin的官網(wǎng)教程择膝,以及 拋物線的網(wǎng)站。
參考:
https://www.kotlincn.net/
https://kaixue.io/kotlin-basic-1/?utm_source=androidweekly.io&utm_medium=website