跟著扔物線大佬的kotlin學(xué)習(xí)之旅開始了
一.基本數(shù)據(jù)類型
分類 | 類型 | 位寬 |
---|---|---|
浮點型 | Double | 64 |
浮點型 | Float | 32 |
整型 | Long | 64 |
整型 | Int | 32 |
整型 | Short | 16 |
字節(jié) | Byte | 8 |
*Kotlin 中的 ==和Java的equals 等價
注意: 在Java里面把基本數(shù)據(jù)類型和引用類型做了區(qū)分,例如int 和 Integer 這兩個類型. 在Kotlin中不區(qū)分基本數(shù)據(jù)類型和包裝類型,永遠都是同一個類型(比如:Int)
二.申明變量以及注意事項
變量不可空
var name: String ="test"
- kotlin變量無默認(rèn)值
- 在 Kotlin 里面狸驳,所有的變量默認(rèn)都是不允許為空的
- 變量不可直接賦值為null, Kotlin有空安全設(shè)計
變量的值要想設(shè)置為空,需要解除非空限制
//類型右邊加一個 ? 號预明,解除它的非空限制
var view: View? = null
//解除非空限制后,在代碼的任意地方都可以賦null
var name: String? = "Z"
name = null
但是可能為空的變量,不允許使用, 即便是加了非空判斷
//可能為空的變量,不允許使用, 即便是加了非空判斷
var view: View? = null
view.setBackgroundColor(Color.BLACK) //該行代碼會報錯
延遲初始化 lateinit
延遲初始化對變量的賦值次數(shù)沒有限制,你仍然可以在初始化之后再賦其他的值給 view
lateinit var view: View
類型判斷
Kotlin 申明變量賦值,不寫變量類型也是可以的
kotin會做類型判斷,但是和動態(tài)類型是不一樣的
var name: String = "M"
var name= "M"
不可中途更換數(shù)據(jù)類型
var name = "Mike"
name = 1
// ??會報錯耙箍,The integer literal does not conform to the expected type String
var 和 val
var 是 variable 的縮寫贮庞,val 是 value 的縮寫。
val 只能賦值一次,不能被修改 ,和java中的final類似
三 . 函數(shù)
fun cook(name: String) {
}
Kotlin 返回是 Unit究西,可省略
fun main(): Unit {}
// Unit 返回類型可以省略
fun main() {}
傳參注意項
- 可空變量不可傳給可空參數(shù)方法
- 變量和方法的參數(shù),需同時可為空,或同時不為空
// ??可空變量傳給不可空參數(shù)窗慎,報錯
var myName : String? = "rengwuxian"
fun cook(name: String) : Food {}
cook(myName)
// ??可空變量傳給可空參數(shù),正常運行
var myName : String? = "rengwuxian"
fun cook(name: String?) : Food {}
cook(myName)
// ??不可空變量傳給不可空參數(shù),正常運行
var myName : String = "rengwuxian"
fun cook(name: String) : Food {}
cook(myName)
四 .可見性
函數(shù)如果不加可見性修飾符的話遮斥,默認(rèn)的可見范圍和變量一樣也是 public 的
override 例外
五. 屬性的getter/setter函數(shù)
*getter / setter 函數(shù)有了專門的關(guān)鍵字 get 和 set
*getter / setter 函數(shù)位于 var 所聲明的變量下面
*setter 函數(shù)參數(shù)是 value
*val 聲明的變量不能重寫setter函數(shù)
class User {
var name = "Mike"
??
get() {
return field + "nb"
}
?? ??
set(value) {
field = "Cute " + value
}
}
六. 類
- 類的可見性, kotlin的類默認(rèn)是public的
- kotlin 里的類默認(rèn)是 final的, 而 Java 里只有加了 final 關(guān)鍵字的類才是 final 的(接觸final用
open
)
open class MainActivity : AppCompatActivity() {}
- open 沒有父類到子類的遺傳性
- 繼承是用
:
- implement 實現(xiàn)也是
:
class MainActivity : AppCompatActivity(), Impl {}
Kotlin 把構(gòu)造函數(shù)單獨用了一個 constructor 關(guān)鍵字來和其他的 fun 做區(qū)分峦失。
override 的不同
- Java 里面 @Override 是注解的形式。
- Kotlin 里的 override 變成了關(guān)鍵字术吗。
- Kotlin 省略了 protected 關(guān)鍵字尉辑,也就是說,Kotlin 里的 override 函數(shù)的可見性是繼承自父類的较屿。
- override 是有遺傳性的
class NewActivity : MainActivity() {
// ??onCreate 仍然是 override 的
override fun onCreate(savedInstanceState: Bundle?) {
...
}
}
關(guān)閉 override 的遺傳性隧魄,只需要這樣即可:
open class MainActivity : AppCompatActivity() {
// ??加了 final 關(guān)鍵字,作用和 Java 里面一樣隘蝎,關(guān)閉了 override 的遺傳性
final override fun onCreate(savedInstanceState: Bundle?) {
...
}
}
abstract 關(guān)鍵字的不同
- abstract 關(guān)鍵字修飾的類無法直接實例化
- 會和 abstract 修飾的函數(shù)一起出現(xiàn)
- 也可以沒有這個 abstract 函數(shù)
abstract class MainActivity : AppCompatActivity() {
abstract fun test()
}
- 子類如果要實例化购啄,還需要實現(xiàn)MainActivity里面的 abstract 函數(shù):
實例化類
var activity: Activity = NewActivity()
類型判斷和強轉(zhuǎn)
- 用
as
強轉(zhuǎn)成一個錯誤類型, 會拋出異常 - 用
as?
(如果強轉(zhuǎn)成功就執(zhí)行,如果不成功就不執(zhí)行)
(activityno as? NewActivity).actions()