Kotlin 面向?qū)ο蟮囊恍┕P記

接口提供默認(rèn)實(shí)現(xiàn)的方法

以前 Java 中骑冗,我們要是在接口中增加一個(gè)方法,那么所有實(shí)現(xiàn)這個(gè)接口的類都必須要重寫(xiě)這個(gè)方法湾盒,但是在 Kotlin 中我們可以定義一個(gè)帶有方法實(shí)現(xiàn)的接口,那么之前實(shí)現(xiàn)過(guò)該接口的類埋哟,就可以不用實(shí)現(xiàn)這個(gè)新方法钠导。例如:

interface Test {
    fun sayHi();
    fun code(){
        print("coding")
    }
}
//實(shí)現(xiàn)接口坐梯,我們可以不實(shí)現(xiàn)接口里已經(jīng)默認(rèn)實(shí)現(xiàn)的方法
class MainActivity : AppCompatActivity(),Test {
    override fun sayHi() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

}

by lazy , lateinit

by lazy:
1.變量必須是引用不變的徽诲,不能通過(guò) var 來(lái)聲明
2.首次調(diào)用時(shí),被賦值烛缔,一旦被賦值馏段,后續(xù)不能更改
3.系統(tǒng)會(huì)默認(rèn)給 lazy 屬性加上同步鎖轩拨,也就 LazyThreadSafetyMode.SYNCHRONIZED,當(dāng)然也可以更改践瓷。

 /**
     * Locks are used to ensure that only a single thread can initialize the [Lazy] instance.
     */
    SYNCHRONIZED,

    /**線程并行執(zhí)行
     * Initializer function can be called several times on concurrent access to uninitialized [Lazy] instance value,
     * but only the first returned value will be used as the value of [Lazy] instance.
     */
    PUBLICATION,

    /**不做線程保證
     * No locks are used to synchronize an access to the [Lazy] instance value; if the instance is accessed from multiple threads, its behavior is undefined.
     *
     * This mode should not be used unless the [Lazy] instance is guaranteed never to be initialized from more than one thread.
     */
    NONE,

多繼承問(wèn)題

1.內(nèi)部類
關(guān)鍵字 inner,因?yàn)閮?nèi)部類可以繼承一個(gè)與外部類無(wú)關(guān)的類
2.使用委托代替多繼承
通過(guò)關(guān)鍵字 by 實(shí)現(xiàn)委托亡蓉,替代多繼承
(類似Java實(shí)現(xiàn)多接口)晕翠,委托是用一個(gè)具體的類去實(shí)現(xiàn)方法的邏輯

data class

簡(jiǎn)化 Java Bean,其中多了 copy,componentN

copy:
看看下面熟悉的代碼,猜猜會(huì)打印什么

Test t1 = new Test("blue");
Test t2 = t1;
t2.setColor("red")
System.out.println(t1.getColor());
//red

理由 t2 引用了 t1砍濒,也就是淺拷貝淋肾,除了基本類型,其他都是只是一個(gè)引用而已爸邢,那么一個(gè)設(shè)置了值另外一個(gè)自然也就更著變了樊卓。
在 koltin 中 copy 是提供了一個(gè)簡(jiǎn)潔的復(fù)制一個(gè)對(duì)象的做法,它也是淺拷貝的一種方式杠河,所以在使用的時(shí)候要主要 數(shù)據(jù)的屬性使用 var 還是 **val碌尔,如果是 可變屬性 **var 的話浇辜,就不能保證會(huì)不會(huì)出現(xiàn)引用更改。

val test = Test("blue")
val test2 =  test.copy("red")

componentN
可以理解為類的屬性的值唾戚,N 代表第幾個(gè)值柳洋,比如 component1 就是代表第一個(gè)參數(shù)。作用就是可以將類的屬性賦值給變量叹坦。
看看 Java 代碼:

String test = "say_hi"
String[ ] value= test .split("_")
String valueOne = value[0]

取一個(gè)值要分好幾步熊镣,那么在 Kotlin 中呢

val(valueOne,valueTwo) =  test .split("_")

伴生對(duì)象

跟 Java 中的 static 修飾符效果一樣绪囱,全局只有一個(gè)單例毕箍,需要聲明在類的內(nèi)部而柑,相較于 Java 事類中的結(jié)構(gòu)更加清晰

companion object{
//類中的所有靜態(tài)變量和靜態(tài)方法都可以聲明在這里
}

單例:
既然全局只有一個(gè)單例荷逞,那么就可以用做 單例模式來(lái)使用了,單例模式的特點(diǎn),構(gòu)造方法私有涩澡,提供一個(gè)靜態(tài)方法來(lái)創(chuàng)建一個(gè)單例的對(duì)象坠敷,那么結(jié)合 by lazy 我們就可以創(chuàng)建一個(gè)線程安全的單例了:

class Singleton private constructor() {
    companion object {
        val instance: Singleton by lazy { Singleton() }
    }
}

object 表達(dá)式

解決匿名內(nèi)部類的問(wèn)題,例如寫(xiě)的最多的就是 各種監(jiān)聽(tīng)事件了膝迎,用 object 可以讓匿名內(nèi)部類更加的優(yōu)雅

var testClick = object : View.OnClickListener {
        override fun onClick(v: View?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

    }

不過(guò)有人會(huì)說(shuō) 使用 lambda 表達(dá)式不是更優(yōu)雅嘛芒涡,確實(shí)费尽,在這種只需要實(shí)現(xiàn)一個(gè)方法的時(shí)候 lambda 會(huì)更優(yōu)雅一點(diǎn)旱幼,但是在有多個(gè)方法的時(shí)候柏卤,為覺(jué)得 object 表達(dá)式的優(yōu)勢(shì)就出來(lái)了

  animator.addListener(testAnimator)
  

   var testAnimator = object : Animator.AnimatorListener {
       override fun onAnimationRepeat(animation: Animator?) {
           TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
       }

       override fun onAnimationEnd(animation: Animator?) {
           TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
       }

       override fun onAnimationCancel(animation: Animator?) {
           TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
       }

       override fun onAnimationStart(animation: Animator?) {
           TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
       }
   }

這樣看起來(lái)就很舒服了叹誉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酸舍,更是在濱河造成了極大的恐慌,老刑警劉巖淮阐,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁品,死亡現(xiàn)場(chǎng)離奇詭異挑随,居然都是意外死亡膏孟,警方通過(guò)查閱死者的電腦和手機(jī)柒桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)丢氢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒸走,“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了扰付?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵堤撵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我羽莺,道長(zhǎng)实昨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任盐固,我火速辦了婚禮荒给,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刁卜。我一直安慰自己锐墙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布长酗。 她就那樣靜靜地躺著溪北,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夺脾。 梳的紋絲不亂的頭發(fā)上之拨,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音咧叭,去河邊找鬼蚀乔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛菲茬,可吹牛的內(nèi)容都是我干的吉挣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼婉弹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼睬魂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起镀赌,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氯哮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后商佛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體喉钢,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姆打,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肠虽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔戏。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖税课,靈堂內(nèi)的尸體忽然破棺而出评抚,到底是詐尸還是另有隱情,我是刑警寧澤伯复,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布慨代,位于F島的核電站,受9級(jí)特大地震影響啸如,放射性物質(zhì)發(fā)生泄漏侍匙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一叮雳、第九天 我趴在偏房一處隱蔽的房頂上張望想暗。 院中可真熱鬧,春花似錦帘不、人聲如沸说莫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)储狭。三九已至,卻和暖如春捣郊,著一層夾襖步出監(jiān)牢的瞬間辽狈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工呛牲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刮萌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓娘扩,卻偏偏與公主長(zhǎng)得像着茸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琐旁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344