詳解Kotlin中的面向對象(二)
在Kotlin中的面向對象(一)中,介紹了Kotlin類的相關操作,本文將在上文的基礎上,繼續介紹屬性、接口等同樣重要的面向對象的功能。
屬性
class AttrDemo{ private var attr1 : String = ""; protected var attr2 : String = ""; public var attr3 : String = ""; var varattr : String = ""; val valattr : String = ""; var attr = 1; }
屬性是每個對象中最基本的單位,也是必不可少的一部分,與Java一樣,Kotlin也提供了private、protected、public三種聲明變量的方式,不同的是,在Kotlin中如果沒聲明訪問權限,默認認為是public類型,即在其他任何地方都可以訪問。同時,Kotlin提供了var和val用來表示屬性的讀寫權限,var是可讀寫的變量,val則是只讀變量,類似於Java中的final。
需要注意,Kotlin對於空安全的要求非常嚴格,所以對於所有的屬性都需要進行初始化,因此也可以通過直接賦值的方式說明屬性的類型,不一定非在後面通過冒號的方式追加。不過對於習慣Java語法的開發者而言可能還是會注明屬性的類型,而習慣腳本語言的開發者可能會傾向於直接賦值。
在Kotlin中,get和set方法不是必須的,因為Kotlin會自動對get和set方法進行處理,變成直接調用屬性的方式(可參考Kotlin的第一行代碼中的說明),但Kotlin還是有自己獨特的使用get和set的方式
private var attr1 : String get() = attr1.toString() set(value) { attr1 = value } protected var attr2 : String get() { //TODO GET return attr2.toString() } set(value) { attr2 = value }
Kotlin提供了多種設置get和set的方法,上面的代碼中展示了兩種get方法和一種set方法,有時當你希望改變get、set的訪問權限或是使用注解時,也可以直接對get、set進行操作
var attr4 : String = "" //一定要初始化 private set
接口
和Java類似,Kotlin使用interface作為接口的關鍵詞,和抽象類相比,他們都可以包含抽象的方法以及方法的實現,但接口無法保存狀態。
interface mInterfaceDemo{ fun function1() fun function2(){ } }
和繼承的方式類似,實現接口也是使用冒號“:”,不過方法略有不同
class InterfaceDemoImpl : mInterfaceDemo{ override fun function1() { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }
我們可以在接口中申明屬性,但接口中的屬性要麼是抽象的,要麼提供訪問器的實現。接口屬性不可以有後備字段,而且訪問器不可以引用它們。
泛型
泛型是程序設計語言的一種特性。允許程序員在強類型程序設計語言中編寫代碼時定義一些可變部分,那些部分在使用前必須作出指明。像 java 一樣,Kotlin 中的類可以擁有類型參數
class GenericDemo<T>(t : T){ var value = t }
通常來說,我們需要這樣構建一個對象
val generic: GenericDemo<Int> = GenericDemo<Int>(1)
但如果類型是需要推斷的,也可以通過傳入忽略類型的參數進行創建
val generic = GenericDemo(1)
嵌套類
Kotlin中的類也可以嵌套在別的類中
class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 } }
可以通過inner修飾符增加一個對外部類的引用,使得內部類可以調用外部類的屬性
class Outer { private val bar: Int = 1 inner class Inner { fun foo() = bar } } val demo = Outer().Inner().foo() //==1
對於匿名內部類,通過對象表達式進行創建
mvp_button.setOnClickListener(object : View.OnClickListener{ override fun onClick(v: View?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } });
如果對象是函數式的 java 接口的實例(比如只有一個抽象方法的 java 接口),我們可以用一個帶接口類型的 lambda 表達式創建它。
mvp_button.setOnClickListener { startActivity(Intent(MainActivity@this,MVPActivity::class.java)) }
枚舉類
枚舉類最基本的用法就是實現類型安全的枚舉,每個自舉常量都是一個對象。枚舉常量通過逗號分開。
enum class Direction { EAST,NORTH,SOUTH,WEST }
因為每個枚舉對象都是一個實例,所以我們可以對其進行初始化
enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) }
當我們需要調用枚舉對象的內容時,可以通過valueof獲取某個枚舉對象的值,或者通過values獲取所有枚舉對象
Direction.EAST Direction.valueOf("EAST"); Direction.values()
需要注意,如果指定的名字在枚舉類中沒有任何匹配,那麼valueOf()方法將會拋出參數異常
Kotlin中核面向對象相關的內容就介紹到這裡,相關的代碼均提交在github中,
本文源碼下載:http://xiazai.jb51.net/201706/yuanma/helloKotlin-master(jb51.net).rar
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!