Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-類和對(duì)象(下)-基礎(chǔ)語法(五)

本人也是在初學(xué)Kotlin,如有錯(cuò)誤,請(qǐng)幫忙指出,持續(xù)更新

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-類和對(duì)象(下)-基礎(chǔ)語法(五)

建議先看看前面的文章
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基礎(chǔ)語法(一)

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基本類型-基礎(chǔ)語法(二)

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-包-控制流-返回與跳轉(zhuǎn)-基礎(chǔ)語法(三)

Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-類和對(duì)象-基礎(chǔ)語法(四)

這篇文章分享的內(nèi)容比較多,建議先關(guān)注收藏柳畔,再查看,以免迷路
抽象類

一個(gè)類或一些成員可能被聲明成 abstract 郭赐。一個(gè)抽象方法在它的類中沒有實(shí)現(xiàn)方 法薪韩。記住我們不用給一個(gè)抽象類或函數(shù)添加 open 注解,它默認(rèn)是帶著的捌锭。

abstract class Derived : Base() { 
    override abstract fun f() 
}
伴隨對(duì)象

在 kotlin 中不像 java 或者 C# 它沒有靜態(tài)方法躬存。在大多數(shù)情形下,我們建議只用包 級(jí)別的函數(shù)舀锨。
在kotlin中如果我們想直接調(diào)用某個(gè)方法可以添加@JvmStatic注解也可以使用companion伴生對(duì)象,如果想直接使用一個(gè)屬性宛逗,使用@JvmField

class StringUtils{
    companion object {
        fun isEmpty(str:String):Boolean{
            return "".equals(str)
        }
    }
}
屬性和字段
屬性聲明

在 Kotlin 中類可以有屬性坎匿,我們可以使用 var 關(guān)鍵字聲明可變屬性,或者用 val 關(guān) 鍵字聲明只讀屬性。
可以像使用 java 中的字段那樣,通過名字直接使用一個(gè)屬性:

val result = Address() // 在 kotlin 中沒有 new 關(guān)鍵字
Getters 和 Setters

語法中的初始化語句替蔬,getter 和 setter 都是可選的告私。如果屬性類型可以從初始化語 句或者類的成員函數(shù)中推斷出來,那么他的類型也是忽略的。
只讀屬性的聲明語法和可變屬性的聲明語法相比有兩點(diǎn)不同: 它以 val 而不是 var 開頭承桥,不允許 setter 函數(shù)驻粟。

編譯時(shí)常量

那些在編譯時(shí)就能知道具體值的屬性可以使用 const 修飾符標(biāo)記為 編譯時(shí)常量

const val SUBSYSTEM_DEPRECATED: String = "This subsystem is depr ecated
延遲初始化屬性

這個(gè)修飾符只能夠被用在類的 var 類型的可變屬性定義中,不能用在構(gòu)造方法中. 并且屬性不能有自定義的 getter 和 setter訪問器.這個(gè)屬性的類型必須是非空的,同 樣也不能為一個(gè)基本類型屬性加上 lateinit 修飾符。

接口

Kotlin 的接口很像 java 8凶异。它們都可以包含抽象方法蜀撑,以及方法的實(shí)現(xiàn)。和抽象類 不同的是剩彬,接口不能保存狀態(tài)酷麦。可以有屬性但必須是抽象的喉恋,或者提供訪問器的實(shí)現(xiàn)沃饶。
接口用關(guān)鍵字 interface 來定義:

interface MyInterface { 
    fun bar() 
    fun foo() { 
    //函數(shù)體是可選的 
    } 
}
實(shí)現(xiàn)接口

一個(gè)類或?qū)ο罂梢詫?shí)現(xiàn)一個(gè)或多個(gè)接口

class Child : MyInterface { 
    fun bar () { //函數(shù)體 
    } 
}
接口中的屬性

可以在接口中申明屬性。接口中的屬性要么是抽象的轻黑,要么提供訪問器的實(shí)現(xiàn)糊肤。接 口屬性不可以有后備字段。而且訪問器不可以引用它們氓鄙。

可見性修飾詞

類馆揉,對(duì)象,接口玖详,構(gòu)造函數(shù)把介,屬性以及它們的 setter 方法都可以有可見性修飾詞。( getter與對(duì)應(yīng)的屬性擁有相同的可見性)蟋座。在 Kotlin 中有四種修飾 詞: private , protected , internal ,以及 public 拗踢。默認(rèn)的修飾符是 public 。

函數(shù)向臀,屬性和類巢墅,對(duì)象和接口可以在 "top-level" 聲明,即可以直接屬于包:

// 文件名: example.kt 
package foo 
fun baz() {} 
class bar {}
  • 如果沒有指明任何可見性修飾詞券膀,默認(rèn)使用 public ,這意味著你的聲明在 任何地方都可見君纫;
  • 如果你聲明為 private ,則只在包含聲明的文件中可見芹彬;
  • 如果用 internal 聲明蓄髓,則在同一模塊中的任何地方可見;
  • protected 在 "top-level" 中不可以使用
// 文件名: example.kt 
package foo 
private fun foo() {} // 在example.kt可見 
public var bar: Int = 5 // 屬性在認(rèn)可地方都可見 
private set // setter僅在example.kt中可見 
internal val baz = 6 // 在同一module中可見
構(gòu)造函數(shù)

通過下面的語法來指定主構(gòu)造函數(shù)(必須顯示的使用 constructor 關(guān)鍵字)的可見性:

class C private constructor(a: Int) { ... }

這里構(gòu)造函數(shù)是 private 舒帮。所有的構(gòu)造函數(shù)默認(rèn)是 public ,實(shí)際上只要類是可見 的它們就是可見的 (注意 internal 類型的類中的 public 屬性只能在同一個(gè)模塊 內(nèi)才可以訪問)

函數(shù)擴(kuò)展

為了聲明一個(gè)函數(shù)擴(kuò)展会喝,我們需要在函數(shù)前加一個(gè)接收者類型作為前綴陡叠。下面我們 會(huì)為 MutableList<Int> 添加一個(gè) swap 函數(shù):

fun MutableList<Int>.swap(x: Int, y: Int) { 
    val temp = this[x] // this 對(duì)應(yīng) list 
    this[x] = this[y] 
    this[y] = tmp 
}

在擴(kuò)展函數(shù)中的 this 關(guān)鍵字對(duì)應(yīng)接收者對(duì)象。現(xiàn)在我們可以在任何 MutableList<Int> 實(shí)例中使用這個(gè)函數(shù)了:

val l = mutableListOf(1, 2, 3) 
l.swap(0, 2)// 在 `swap()` 函數(shù)中 `this` 持有的值是 `l`
屬性擴(kuò)展

和函數(shù)類似肢执, Kotlin 也支持屬性擴(kuò)展:

val <T> List<T>.lastIndex: Int 
get() = size-1

注意枉阵,由于擴(kuò)展并不會(huì)真正給類添加了成員屬性,因此也沒有辦法讓擴(kuò)展屬性擁有 一個(gè)備份字段.這也是為什么初始化函數(shù)不允許有擴(kuò)展屬性预茄。擴(kuò)展屬性只能夠通過明 確提供 getter 和 setter方法來進(jìn)行定義.

伴隨對(duì)象擴(kuò)展

如果一個(gè)對(duì)象定義了伴隨對(duì)象兴溜,你也可以給伴隨對(duì)象添加擴(kuò)展函數(shù)或擴(kuò)展屬性:

class MyClass { 
    companion object {} 
}
fun MyClass.Companion.foo(){ 
}

MyClass.foo()
數(shù)據(jù)類

和java的bean類似

data class User(val name: String, val age: Int)
泛型

像 java 一樣,Kotlin 中的類可以擁有類型參數(shù):

class Box<T>(t: T){ 
    var value = t 
}
嵌套類

類可以嵌套在其他類中

class Outer { 
    private val bar: Int = 1 
    class Nested { 
    fun foo() = 2 
    } 
}
val demo = Outer.Nested().foo() //==2
內(nèi)部類

類可以標(biāo)記為 inner 這樣就可以訪問外部類的成員耻陕。內(nèi)部類擁有外部類的一個(gè)對(duì)象 引用:

class Outer { 
    private val bar: Int = 1 
    inner class Inner { 
        fun foo() = bar 
        } 
}
val demo = Outer().Inner().foo() //==1
匿名內(nèi)部類

匿名內(nèi)部類的實(shí)例是通過 對(duì)象表達(dá)式 創(chuàng)建的

window.addMouseListener(object: MouseAdapter() { 
    override fun mouseClicked(e: MouseEvent) { 
    // ... 
    }
    override fun mouseEntered(e: MouseEvent) { // ... 
    } 
})
對(duì)象聲明

單例模式是一種很有用的模式拙徽,Kotln 中聲明它很方便

object DataProviderManager { 
    fun registerDataProvider(provider: DataProvider) { // ... 
    }
val allDataProviders: Collection<DataProvider> 
    get() = // ... 
}
    
DataProviderManager.registerDataProvider(...)

這叫做對(duì)象聲明,跟在 object 關(guān)鍵字后面是對(duì)象名淮蜈。和變量聲明一樣斋攀,對(duì)象聲明并 不是表達(dá)式,而且不能作為右值用在賦值語句梧田。

伴隨對(duì)象

在類聲明內(nèi)部可以用 companion 關(guān)鍵字標(biāo)記對(duì)象聲明:

class MyClass { 
    companion object Factory { 
        fun create(): MyClass = MyClass() 
    } 
}

val instance = MyClass.create()

這篇文章主要分享Kotlin中的類淳蔼,對(duì)象,接口等一些屬性裁眯。

本人也是在初學(xué)Kotlin鹉梨,如有錯(cuò)誤,請(qǐng)幫忙指出穿稳,持續(xù)更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末存皂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逢艘,更是在濱河造成了極大的恐慌旦袋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件它改,死亡現(xiàn)場(chǎng)離奇詭異疤孕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)央拖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門祭阀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲜戒,你說我怎么就攤上這事专控。” “怎么了遏餐?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵伦腐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我失都,道長(zhǎng)蔗牡,這世上最難降的妖魔是什么颖系? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辩越,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘信粮。我一直安慰自己黔攒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布强缘。 她就那樣靜靜地躺著督惰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旅掂。 梳的紋絲不亂的頭發(fā)上赏胚,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音商虐,去河邊找鬼觉阅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秘车,可吹牛的內(nèi)容都是我干的典勇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼叮趴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼割笙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眯亦,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤伤溉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后妻率,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乱顾,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年舌涨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糯耍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囊嘉,死狀恐怖温技,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扭粱,我是刑警寧澤舵鳞,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站琢蛤,受9級(jí)特大地震影響蜓堕,放射性物質(zhì)發(fā)生泄漏抛虏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一套才、第九天 我趴在偏房一處隱蔽的房頂上張望迂猴。 院中可真熱鬧,春花似錦背伴、人聲如沸沸毁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽息尺。三九已至,卻和暖如春疾掰,著一層夾襖步出監(jiān)牢的瞬間搂誉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工静檬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炭懊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓巴柿,卻偏偏與公主長(zhǎng)得像凛虽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子广恢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容