1. 程式人生 > 其它 >kotlin編譯失敗_最強總結 | 帶你快速搞定kotlin開發(上篇)

kotlin編譯失敗_最強總結 | 帶你快速搞定kotlin開發(上篇)

技術標籤:kotlin編譯失敗

關注我,你的眼睛會懷孕

a4b84531c5e024c0173a6b755dddd2d4.png aa5744ce7896caef146869315f4a4461.gif

Kotlin必知必會(上)

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.1 函式:

funsum(a:Int,b:Int):Int{
returna+b
}
//對於只有一行的函式,kotlin可以這麼簡寫,爽不?
funsum(a:Int,b:Int):Int=a+b

可以看到函式的宣告是通過fun關鍵字的,函式的引數型別和引數名的位置跟Java是相反的,中間使用:分隔,函式的返回型別是放在最後的,當然也是使用:進行分割的,如果沒有返回值的時候可以省略或者使用Unit,相當於Java的void

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.2 變數:

varage:Int=18
valname:String="Kotlin"
valperson=Person()

使用var來宣告可讀可寫變數,使用val來宣告只讀變數(引用不可變)。
val可以理解為Java中的屬性宣告加上了final關鍵字(將kotlin的位元組碼反編譯成Java一看就知道了),其實kotlin是更傾向於推薦使用val來宣告變數,這是一種防禦性的編碼思維模式,目的是減少程式出錯或者變的更加安全。
可以看到例項化Person物件時,並沒有宣告變數型別,這就是Kotlin的“型別推斷”,會自動推斷出是Person型別的變數,而且是不需要Java中的new關鍵字的。

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.3 繼承和實現介面

classMyActivity:Activity(),View.OnClickListener{
//省略
}

一看就懂,不用多說吧。注意加上(),如果你的kotlin類能夠被繼承,需要使用open關鍵字,因為預設是final的:

openclassPerson{
constructor(age:Int)
varage:Int=0
}
//當你的建構函式呼叫父類的建構函式時,要去掉Person後面的()
classMan:Person{
//使用super呼叫父類的構造器
constructor(age:Int):super(age)
}
700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.4 空安全設計

//不可空型別
valperson:Person

//可空型別
valperson2:Person?

那麼對於可空型別的變數在呼叫時可以選擇使用:

valperson:Person?=null
//安全呼叫
person?.age=18
//強行呼叫
person!!.name="kotlin"

使用呼叫符,就算person是null的也不會出現空指標了,相當於Java中的判空了。當然如果你能確認person不會為空,可以使用!!強行呼叫符

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.5 lateinit關鍵字

lateinitvarperson:Person
person=Person()

我們總有場景在宣告的時候不知道賦什麼值,在後面才去賦值的場景,那麼就可以使用lateinit關鍵字。但是隻能在以下場景下使用:

  • var宣告的變數

  • lateinit修飾的變數不可空、不能是基本資料型別、不能有初始值

  • 構造器中初始化的變數不需要使用lateinit關鍵字

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.6 型別判斷

if(pisPerson){
p.age=20
}
valman:Man=Person()
valper:Person=manasPerson

is關鍵字類似於Java中的instanceof,判斷是否是什麼型別,判斷不是什麼型別可用!is,可以看到kotlin有個小優化,就是p在條件成立時,不需要再強轉了,直接被認為是Person的型別,進而可以使用Person的API。當你真的需要強轉時可以使用asas?關鍵字,帶?的在強轉失敗時並不會拋異常,而是返回一個null值

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.7 獲取class物件

//Person.kt
Person::class
//Man.javaMan::class.java

區別於Java,kotlin要相容Java,所以獲取Java的class和kotlin的class略有不同,kotlin的class使用::class,而在kotlin中獲取Java的class可以使用::class.java

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.8 setter和getter

classPerson{
varage:Int?=null
}
//等價於
classPerson{
varage:Int?=nullget(){
returnfield
}
set(value){
field=value
}
}

kotlin在宣告非private的屬性時,會預設生成對應的公開的set和get方法,當你在Java中訪問時必須:

Personp=newPerson();
p.setAge(20);

不過如果你就要直接訪問age屬性也是可以的,使用@JvmField註解:

//kotlin
classPerson:Any{
//kotlin建構函式使用constructor關鍵字
constructor()
//加上這個註解,編譯器只會生成一個public的屬性,而不生成set和get方法
@JvmFieldvarage:Int=19
}
//java
publicclassTest{
privatevoidsome(){
Personp=newPerson();
p.age=20;
}
}
700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.9 陣列

openclassPerson{
constructor(age:Int)
varage:Int=0

funtest(){
//會有裝箱拆箱的操作,會影響效能
valages=arrayOf(14,15,16)
//基本資料型別使用對應的函式,比如intArrayOf()函式避免拆裝箱的過程
valages2=intArrayOf(14,15,16)
}
}

可以使用arrayOf()來建立陣列。對於基本資料型別優先使用對應的函式進行建立。

700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.10 靜態函式和屬性

//方法在類的外面【包級函式】或者叫【頂層函式】
fungetSomething():Int{
return0
}

classPerson{}

//在Java中使用類名+Kt字尾直接訪問
PersonKt.getSomething();

//在kotlin檔案中呼叫更加方便,只需要導包,不需要加類名
//但是這種方式並不有利於閱讀,會和類中的函式搞混淆
getSomething()

可以看到我們可以直接在檔案裡面宣告函式,然後通過類名+Kt的方式直接呼叫。這種叫包級函式

objectPerson{
fungetSomething():Int{
return0
}
}

//kotlin中呼叫
Person.getSomething()
//java中呼叫
Person.INSTANCE.getSomething();

其實使用object建立類的時候,預設會生成一個單例物件,當我們使用類名來直接呼叫的時候,其實是通過預設的單例物件進行呼叫的。本質上和我們java中的靜態方法還是不同的。

classPerson{
companionobject{
fungetSomething():Int{
return0
}
}
}

//kotlin
Person.getSomething()
//java,好麻煩,但是可以使用註解@JvmStatic來讓編譯器編譯成靜態的
Person.Companion.getSomething();
//java使用註解後就可以在Java中直接呼叫了
Person.getSomething();

使用companion object(伴生物件)的方式相當於有一個內部類的單例物件,這些通過kotlin的位元組碼反編譯成Java檔案就可以看出來。看起來比直接使用static關鍵字麻煩多了,那kotlin為啥要去掉static這個關鍵字呢?那得問當初設計kotlin語言的人了,從面向物件的角度來說,這麼設計的確更符合萬物皆物件的理念,因為static只跟類有關,而不是和物件有關。

所以,我們可以看出來使用object貌似和建立預設物件有關係,不錯,比如匿名內部類(本質上就是建立一個物件)

varview=window.decorView
funtest(){
view.setOnClickListener(object:View.OnClickListener{
overridefunonClick(v:View?){

}
})
}
//當然可以簡寫成下面這樣
funtest(){
view.setOnClickListener{

}
}
700f5ab8905dcfa0e7ae2251b6b99b5f.gif

1.11 小技巧

可以使用 ${} 來做字串模板:

valage=18
valinfo="我是一個${age}歲的帥哥"

支援多行字串,使用三個引號"""

valinfo="""
hhahha
jaa
sdfjdkjs
jsafjs
""".trimIndent()

判斷資料範圍和switch的使用:

//如果年齡在10到30(包括30)
if(agein10..30)
//使用when取代Java中的switch,並且是支援表示式的
when(age){
18->{

}
19->{

}
in20..30->{
}
}

在 Java 中通過 「 類名.this 例如 Outer.this 」 獲取目標類引用
在 Kotlin中通過「[email protected]類名 例如[email protected]」獲取目標類引用

本篇介紹為入門知識點,下一篇將著重介紹kotlin進階知識點,歡迎關注~

e26a1542db0dc8db1c2b8268ef49c7c5.png