幼兒園入門
嘀嘀嘀校車來咯--kotlin是啥?了解一哈!
Kotlin 是一種在 Java 虛擬機上運行的靜態類型編程語言,被稱之為 Android 世界的Swift,Kotlin 可以編譯成Java字節碼,也可以編譯成 JavaScript,方便在沒有 JVM 的設備上運行。在Google I/O 2017中,Google 宣布 Kotlin 成為 Android 官方開發語言(那啥此處劃重點--重點了解)。
我覺得這句劃重點的話是我們選擇kotlin的關鍵,當然除了google支持的官方語言,它還有很多優點比如說大大減少樣板代碼的數量,避免空指針異常等整個類的錯誤,充分利用 JVM、Android 和瀏覽器的現有庫,可用任何 Java IDE 或者使用命令行構建。
開門上車--kotlin的hello world!
Kotlin 程序文件以 .kt 結尾,如:hello.kt 、world.kt。
class KotlinTest(){
fun hello(yourName : String){
println("hello world $yourName")
}
}
fun main(args: Array<String>) {
KotlinTest().hello("Licz")
}
老司機平穩上路--基礎語法介紹!
定義基礎
- 常變量定義
在Kotlin中常量用val聲明,變量用var聲明,關鍵字還是在名稱前面,類型用”:“隔開在名稱后面,或者也可以直接省略類型直接在名稱后用“=”賦值。
var <標識符> : <類型> = <初始化值>
val <標識符> : <類型> = <初始化值>
- 空安全定義
類型后帶“?”表示空安全即可為空,名稱后面帶“?”以及“!!”分別表示可返回null即空安全和拋出空指針異常(簡單理解?可以返回null即表示空安全,!!和java原本的類似,什么都不加編譯器會在相對時刻檢測報錯)
//類型后面加?表示可為空
var age: String? = "23"
//拋出空指針異常
val ages = age!!.toInt()
- 懶加載
by lazy{} (多用于單例模式)只能用在val常量類型且只可以初始化一次想要多次初始化只能重新定義, lateinit 只能用在var變量類型并且不能用在java基本類型和可空類型且可以在任何位置初始化并且可以初始化多次
val name: String by lazy { "bestpay" }
lateinit var myTextView: Textview
- 函數定義
函數定義使用關鍵字 fun
幾種示范
fun sum(a: Int, b: Int){ // Int 參數,返回值 Int
printlb( a + b )
}
fun sum(a: Int, b: Int): Int { // Int 參數,返回值 Int
return a + b
}
fun sum(a: Int, b: Int) = a + b
- 字符串模版
$ 表示一個變量名或者變量值,$varName 表示變量值,${varName.fun()} 表示變量的方法返回值:
var a = 1
val s1 = "a is $a"
val s2 = "${s1.replace("is", "was")}, but now is $a" // 解釋一下${}內部可以是函數表達式
- 類型轉換以及自檢判斷
is 運算符檢測一個表達式是否某類型的一個實例(類似于Java中的instanceof關鍵字)。
if (obj is String) {
// 做過類型判斷以后,obj會被系統自動轉換為String類型
return obj.length
}
if (obj is String && obj.length > 0)
return obj.length
基礎數據類型
- Kotlin 的基本數值類型包括Byte、Short、Int、Long、Float、Double等。不同于Java的是,字符不屬于數值類型,是一個獨立的數據類型。其余基本同java。
- 注意幾點:
16 進制以 0x 開頭:0x0F;
2 進制以 0b 開頭:0b00001011;
長整型以大寫的 L 結尾:123L;
Double 默認寫法: 123.5, 123.5e10;
Float 使用 f 或者 F 后綴:123.5f; - 也可以使用下劃線使數字常量更易讀(下劃線無實際意義類似于注釋的意思,怎么看著方便怎么加)
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
- Kotlin 中沒有基礎數據類型,只有封裝的數字類型,你每定義的一個變量,其實 Kotlin 幫你封裝了一個對象,這樣可以保證不會出現空指針。數字類型也一樣,所有在比較兩個數字的時候,就有比較數據大小和比較兩個對象是否相同的區別了。在 Kotlin 中,三個等號 === 表示比較對象地址,兩個 == 表示比較兩個值大小。
條件以及循環控制
-
條件控制
- if表達式
和java那一套很類似,不過更強大
- if表達式
val max = if (a > b) a else b //作為表達式,取代了java的三元操作符
- when表達式
移除了switch使用更加強大的when代替,when的子式可以是常亮、變量、返回數值的表達式、返回boolean值的表達式,強大到替換if...else if
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
//類似switch的用法
3,4 -> print("x == 3 or x == 4")
//由于沒有break 如果兩個值的處理邏輯一樣可以這樣用“,”隔開
is String -> x.startsWith("prefix")
//檢測一個值是(is)或者不是(!is)一個特定類型的值
else -> { // 注意這個括號
//注意else相當于default
print("x 不是 1 ,也不是 2")
}
}
when (x) {
in 1..10 -> print("x is in the range")
!in validNumbers -> print("x is not valid")
//此處在(in)或者不在(!in)一個區間(注意區間,這里沒細說)
else -> print("none of the above")
}
when {
x.isGood() -> print("x is good")
x.isBad() -> print("x is bad")
else -> print("x is X")
//此處為替代if...else if的用法
}
-
循環控制
- for循環
有變化并且多出了幾個變種
- for循環
for (test in collection) print(test)//可以對任何提供迭代器(iterator)的對象進行遍歷
for (test: Int in ints) {
//循環體是一個代碼塊
// ……
}
- while與do...while循環
基本同java無區別
while( 布爾表達式 ) {
//循環內容
}
do {
//代碼語句
}while(布爾表達式);
- 返回和跳轉
return:默認從最直接包圍它的函數或者匿名函數返回。
break:終止最直接包圍它的循環。
continue:繼續下一次最直接包圍它的循環。
for (i in 1..8) {
if (i==2) continue // i 為 2 時跳過當前循環,繼續下一次循環
println(i)
if (i>=5) break // i 為 5 時 跳出循環
}
類以及對象
- 簡述
kotlin的類可以包含的和java代碼的類差不多,有構造函數、內部類、對象聲明、屬性、函數,雖然類型差不多但是形式大大的不一樣。
class Bestpay{ //類名稱 bestpay
fun writeBug(){println("bug")}
//大括號內是類內部內容
}
class Empty //定義空類
- 類屬性
var聲明可變,val聲明不可變
注意一點kotlin中是沒有new這個關鍵字的直接在“=”后面寫要實例化的類就可以
一般要使用一個類屬性或某些方法只要在類后直接“.”屬性名
class Test{
val age : Int = 1
val name : String = "test"
fun writeBug(){println("bug")}
}
val bestpay = Test() //注意沒有new關鍵字
bestpay.name
bestpay.age
- 構造方法
主構造方法注意constructor關鍵字(可省略)還有init()函數
class Person constructor(firstName: String) {}
class Person (firstName: String) {
//此處沒有注解或者可見性修飾符省略constructor關鍵字
init{
//初始化代碼塊
//參數使用往上看!!! 就是類名稱后面括號里面的東西!!!
firstName == “li”+firstName
}
}
次構造方法也叫做二級構造函數,需要加前綴constructor
class Person {
constructor(child: Person) {
}
}
class Person(val name: String) {//主構造函數
constructor (name: String, age:Int) : this(name) {//次構造函數
// 初始化...
}
class Person(val name: String) {//主構造函數
constructor (name: String, age:Int,firstName:String) : this(name,age) {//次構造函數
// 初始化...
}
注意如果類有主構造函數,每個次構造函數都要,或直接或間接通過另一個次構造函數代理主構造函數。在同一個類中代理另一個構造函數使用this關鍵字。
- 抽象類
abstract關鍵字了解一哈 - 內部類
內部類使用 inner 關鍵字來表示。
內部類會帶有一個對外部類的對象的引用,所以內部類可以訪問外部類成員屬性和成員函數。
class Test {
val inn = "123"
inner class innerTest{
fun innertest(){
var t =this@Test
t.inn.equals(inn)
}
}
}
嵌套類
內部類包含嵌套類,嵌套類沒有inner關鍵字匿名內部類
定義和java類似,沒有名字直接實例化使用,常用于接口等回調。
class Test {
var v = "成員屬性"
fun setInterFace(test: TestInterFace) {
test.test()
}
}
/**
* 定義接口
*/
interface TestInterFace {
fun test()
}
fun main(args: Array<String>) {
var test = Test()
/**
* 采用對象表達式來創建接口對象,即匿名內部類的實例。
*/
test.setInterFace(object : TestInterFace {
//注意此處接口的調用方式
override fun test() {
println("對象表達式創建匿名內部類的實例")
}
})
}
- 類修飾符
- classModifier: 類屬性修飾符,標示類本身特性。
abstract // 抽象類
final // 類不可繼承,默認屬性
enum // 枚舉類
open // 類可繼承,類默認是final的
annotation // 注解類
- classModifier: 類屬性修飾符,標示類本身特性。
- accessModifier: 訪問權限修飾符
private // 僅在同一個文件中可見
protected // 同一個文件中或子類可見
public // 所有調用的地方都可見(默認修飾符,什么都不加就是public)
internal // 同一個模塊中可見(包內可見) - 多嘴一句注意data類它是kotlin中特有的bean類用來寫pojo超級方便
data class User(val name: String, val age: Int)
data class TestData(@SerializedName("success") var success: String, @SerializedName("errorCode") var errorCode: String) {
}
就這樣簡單的一個data class,加上主構造函數就構成了kotlin的特有pojo類它有編譯器自動生成的equals()/hashCode()方法、toString()方法、componentN()方法、copy()方法以及“set/get”等方法。
一些補充
- “:”冒號的妙用 類的繼承、聲明常變量的類型、函數的返回值等都有它的身影,除了以上還有Kotlin最終會還是編譯成Java字節碼,使用到Java類是必然的也是要用到“:”冒號的
val intent = Intent(this, Test::class.java)
- 除了冒號還有一個較重要的符號@,this后面加上@對象表明指返回哪一個(內部類return處多用)
class User {
inner class FamilyUser{
fun getUser(): User{
//返回User
return this@User
}
fun getFamilyUser(): FamilyUser{
//返回FamilyUser
return this@FamilyUser
}
}
}
到站下車幼兒園的門在眼前--一些要說的東西!
暫時對databinding的支持不是很友好,一起使用會出現特別多奇葩的看不懂的錯誤。
butterknife無法使用,取而代之的是kotterknife(也是JakeWharton大神的作品)。
轉換為Kotlin工程最簡單的方法Tools -> Kotlin -> Configure Kotin in Project。
Code/Conver Java File to Kotlin File單獨的類轉換成Kotlin代碼。
將Java代碼復制到Kotlin文件會提示轉換也是可以很方便的進行差異對比。
但是有一句說一句哈ide轉換出來的kotlin代碼那是給機器看的 Orz。。。。。。。
反射不是很好用,這部分需要引入一個很大的庫來做,BUT 我們可以直接用java寫。
kotlin-ktx
2018年2月5號的時候,Google 發布了一款 Kotlin 的擴展庫,叫 Android KTX,它能使 Android 上的 Kotlin 代碼更簡潔,從而提高開發者的效率和使用體驗。
Android KTX 其實就是一個 Kotlin 代碼的擴展庫,Google 把我們開發的時候,比較常用的一些代碼塊,進行封裝,然后在這個基礎上,提供更良好的 API,供開發者使用。
總的來說呢,這個東西就是java代碼下的xxxUtils庫,但是由于kotlin的 Extensions 特性,這個庫可以使用起來有著媲美原生api的使用體驗。
來看看ktx包下面都包括了什么!
[圖片上傳失敗...(image-8d70d4-1527574739510)]
看了之后的感覺是不是很刺激?從animation到text,從view到net統統都有。
OK廢話咱們就不多說了直接上碼:
github地址
文檔地址