- Kotlin系列
0.【翻譯】Using Kotlin for Android Development
1.Kotlin入門(一):變量的聲明和使用
2.Kotlin入門(二):方法的定義和使用
3.Kotlin入門(三):if, when, for, while
4.Kotlin入門(四):null安全(“?”,“?:”,“!!”)
5.Kotlin入門(五):類與繼承
6.Kotlin入門(六):內(nèi)聯(lián)方法
7.Kotlin入門(七):enum,data跳夭,sealed饺藤,object
變量聲明
-
只讀變量
可理解為Java中常量辞州,使用 val 關(guān)鍵字修飾
val a: Int = 1 //在聲明的時候直接賦值
val b = 2 // 類型是明確的,變量類型Int可省去
val c: Int // 在聲明時沒有賦值氯材,變量類型Int不可省去
c = 3 // 只可賦值一次甸私,此后c值不能再變
-
易變變量
可理解為Java中的普通變量诚些,用 var 關(guān)鍵字修飾,與 val 變量的區(qū)別是變量的值可變:
var a=0
a=1
a=3
-
成員變量
與Java一樣皇型,通過對象.變量名的方式調(diào)用:
fun main(args: Array<String>) {
print(Test().property)
}
class Test{
var property="property"
}
-
靜態(tài)變量
用companion object{}包裹诬烹,與Java一樣通過類名.變量名的方式調(diào)用,關(guān)于companion object后面會詳細講解:
fun main(args: Array<String>) {
print(Test.com)
}
class Test{
companion object{
var com="com"
}
}
-
頂級變量
在類的外部聲明犀被,可理解為Java中的靜態(tài)成員變量椅您。
通過包名.變量名的方式來調(diào)用
樣例:
package a.b.c
var top = "top"
fun main(args: Array<String>) {
print(a.b.c.top)
}
-
靜態(tài)變量與頂級變量的區(qū)別:
通過反編譯可以知道寡键,其實他們不在一個類中。
當文件中有頂級變量西轩,編譯時會新生成一個[文件名+kt]的類脑沿,頂級變量就在其中藕畔。
Getters and Setters
我們先定義各種可見性的var類型成員變量:
private var privateField = ""
internal var internalField = ""
protected var protectedField = ""
var publicField = ""
然后反編譯看看對應的java代碼:
@NotNull
public final String getInternalField$app() {
return this.internalField;
}
public final void setInternalField$app(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.internalField = var1;
}
@NotNull
protected final String getProtectedField() {
return this.protectedField;
}
protected final void setProtectedField(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.protectedField = var1;
}
@NotNull
public final String getPublicField() {
return this.publicField;
}
public final void setPublicField(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.publicField = var1;
}
可知,protected和public會生成對應的setter和getter方法庄拇,internal也生成了特殊的對應方法。
所以對于protected和public的成員變量措近,我們不能自己創(chuàng)建對應的getter和setter方法,如:
var name:String?
fun setName(name:String){}
將會報錯:
Platform declaration clash: The following declarations have the same JVM signature (setName(Ljava/lang/String;)V)
-
Visibility Modifiers
對于getter
getter的可見性和變量的可見性相同瞭郑,無需重復添加修飾符辜御。非要多此一舉添加,如果和變量的修飾符不一樣屈张,將會報錯擒权,如:
var field: String = ""
private get //報錯: Getter visibility must be the same as property visibility
-
對于setter
setter的可見性必須小于等于變量自身的可見性,否則報錯碳抄,如:
private var name=""
public set //error:Setter visibility must be the same or less permissive than property visibility
我們也可以自定義getter和setter方法
- 語法
<var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
當給變量賦值時會調(diào)用setter方法,調(diào)用變量得到的是getter中的返回值
樣例:
var name: String = "111"
get() {
return "{$field}"
}
set(value) {
field = "[$value]"
}
fun main(args: Array<String>) {
println(name)
name = "222"
print(name)
}
結(jié)果:
{111}
{[222]}