寫(xiě)給Java程序員的Kotlin簡(jiǎn)介(二)

Basics

kotlin中一切皆對(duì)象凯肋,基本數(shù)據(jù)類(lèi)型會(huì)自動(dòng)裝箱成對(duì)象
基本數(shù)據(jù)類(lèi)型位寬與java一致

數(shù)組處理

java中基本數(shù)據(jù)類(lèi)型的數(shù)組用于避免封箱開(kāi)箱的操作躯枢,在kotlin中每一個(gè)java基本類(lèi)型的數(shù)組都有與其對(duì)應(yīng)的類(lèi)型IntArray DoubleArray....
它們不是Array類(lèi)掰担,而是被編譯成java的原生數(shù)組碟摆,來(lái)獲得最好的性能
其for-each 及 in check也不會(huì)帶來(lái)額外的開(kāi)銷(xiāo)(都轉(zhuǎn)換成java基本類(lèi)型操作)
如果java定義變長(zhǎng)基本類(lèi)型時(shí)孕荠,kotlin需傳遞類(lèi)似*IntArray給java

kotlin中無(wú)受檢異常

也就是說(shuō)预厌,編譯器不會(huì)強(qiáng)制你去捕捉任何異常

位操作

shl 類(lèi)似 <<
shr >>
ushr >>>
and &
or |
xor ^
inv ~

布爾運(yùn)算

布爾值的相關(guān)運(yùn)算與java類(lèi)似 || && 阿迈!

Array

//Array支持lambda參數(shù)的構(gòu)造函數(shù)
var a:Array<Int> = Array(2, {it->it*2});

String

支持字符串模板,原生字符串(like python)

Import

支持import as

Visibility Control

  • private 當(dāng)前類(lèi)可見(jiàn)
  • protected private + 繼承類(lèi)可見(jiàn)
  • internal 同一模塊可見(jiàn)(模塊一般指intellij中的一個(gè)module)
  • public 全部可見(jiàn)

Class and Objects

Constructor

class Person private constructor(name:String) {
    // 基礎(chǔ)構(gòu)造函數(shù)不能放初始化代碼轧叽,如需苗沧,放init中
    init {
        var s = name.length
    }
    consturtor(parent:Person) {
        // 如果有基礎(chǔ)構(gòu)造函數(shù),必須調(diào)用
        this(parent.name)
    }
}
// 如果不聲明任何構(gòu)造函數(shù)炭晒,會(huì)自動(dòng)獲得一個(gè)(類(lèi)似java)

Inheritance

open class Derived(p:Int):Base(p) { // 繼承
    // 構(gòu)造函數(shù)必須顯示調(diào)用父類(lèi)
    consturtor(ctx:Int):super(ctx) {
        
    }
}

默認(rèn)情況下所有類(lèi)都是final的除非聲明為open,默認(rèn)所有的方法也是final的
支持多繼承

Object

object 用于聲明單例對(duì)象待逞,object聲明不能有構(gòu)造函數(shù)

object Instance {
    val name = ""
}

Companion Objects

kotlin沒(méi)有靜態(tài)成員,但有伴隨對(duì)象,這樣類(lèi)似靜態(tài)成員的效果

open class A {
    companion object {
        val DEF_NAME = "DefaultName";
    }
    open fun test() {
    }
}

Properties

var <propertyName>: <PropertyType> [= <property_initializer>] [<getter>]
[<setter>]

自定義setter的時(shí)候网严,如果需要對(duì)變量賦值识樱,可以使用Backing Field
eg :

open class Test {
    var a : String? = null
    set(value) {
        if (!value.isNullOrBlank()) {
            field = value // 此處如果使用a=value會(huì)導(dǎo)致遞歸調(diào)用
        }
    }
}

編譯期常量使用const 字段修飾
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
可使用lateinit關(guān)鍵字進(jìn)行懶加載(主要用于單元測(cè)試 setUp初始化)
如果定義一些屬性并且使用基本構(gòu)造函數(shù)初始化的話(huà)一種簡(jiǎn)練的寫(xiě)法是
class Test(var/val name:String)

Interface

接口類(lèi)似java8 可以有方法實(shí)現(xiàn),但其properties必須是abstract

Extensions

Extensions are resolved statically
擴(kuò)展方法是靜態(tài)解析的震束,也就是說(shuō)根據(jù)對(duì)象的聲明類(lèi)型而不是實(shí)際類(lèi)型來(lái)解析應(yīng)該調(diào)用哪個(gè)擴(kuò)展方法的
支持?jǐn)U展屬性,但必須通過(guò)get set訪(fǎng)問(wèn)怜庸,無(wú)法直接初始化
伴隨對(duì)象也支持?jǐn)U展

class C {
    fun D.foo() { // D的擴(kuò)展函數(shù)
    toString() // calls D.toString()
    this@C.toString() // calls C.toString() 
}

Generics

由于kotlin也是jvm語(yǔ)言,因此無(wú)法規(guī)避java泛型相關(guān)問(wèn)題垢村,仍遵循 PECS (Producer-Extends, Consumer-Super),不過(guò)增加了in out關(guān)鍵字割疾,變成了 Consummer in, Producer out
對(duì)于java中<T extends String> 在kotlin中寫(xiě)成<T:String>,如果要extends多個(gè)接口可以使用where關(guān)鍵字

 fun <T> cloneWhenGreater(list: List<T>, threshold: T):List<T>where T : Comparable,T : Cloneable { 
    return list.filter { it > threshold }.map { it.clone()   
  }
}

Nested Classes

聲明普通內(nèi)部類(lèi)需使用 inner關(guān)鍵字否則的話(huà)就類(lèi)似java的靜態(tài)內(nèi)部類(lèi)
枚舉類(lèi)聲明為 enum class XXX

Delegated Properties

代理屬性
代理屬性在被訪(fǎng)問(wèn)的時(shí)候會(huì)調(diào)用代理對(duì)象的相關(guān)方法

object Instance {
    var age:String by Delegate()
}

class Delegate {
    operator fun getValue(any: Instance, property: KProperty<*>): String {
        return any.age
    }

    operator fun setValue(instance: Instance, property: KProperty<*>, s: String) {
        print("you set $instance's age = $s")
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嘉栓,隨后出現(xiàn)的幾起案子宏榕,更是在濱河造成了極大的恐慌,老刑警劉巖侵佃,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麻昼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡趣钱,警方通過(guò)查閱死者的電腦和手機(jī)涌献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)首有,“玉大人燕垃,你說(shuō)我怎么就攤上這事枢劝。” “怎么了卜壕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵您旁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我轴捎,道長(zhǎng)鹤盒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任侦副,我火速辦了婚禮侦锯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秦驯。我一直安慰自己尺碰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布译隘。 她就那樣靜靜地躺著亲桥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪固耘。 梳的紋絲不亂的頭發(fā)上题篷,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音厅目,去河邊找鬼番枚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛璧瞬,可吹牛的內(nèi)容都是我干的户辫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗤锉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渔欢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瘟忱,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奥额,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后访诱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體垫挨,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年触菜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了九榔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哲泊,靈堂內(nèi)的尸體忽然破棺而出剩蟀,到底是詐尸還是另有隱情,我是刑警寧澤切威,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布育特,位于F島的核電站,受9級(jí)特大地震影響先朦,放射性物質(zhì)發(fā)生泄漏缰冤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一喳魏、第九天 我趴在偏房一處隱蔽的房頂上張望棉浸。 院中可真熱鬧,春花似錦刺彩、人聲如沸涮拗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鼓择,卻和暖如春三幻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呐能。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工念搬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摆出。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓朗徊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親偎漫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爷恳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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