Kotlin和Java語法和基礎(chǔ)差異

Kotlin在今年5月份獲得了Android官方的支持德崭,被指定為Android開發(fā)一級語言,一個月之內(nèi)進(jìn)入了編程語言排行榜的前50(艾猜。而Android Studio也有插件支持Kotlin脓杉,Kotlin可以和Java混合使用,AS中支持直接將Java和Kotlin代碼互相轉(zhuǎn)換黔攒,相對來講Kotlin代碼比Java簡潔一些

變量、常量强缘、方法

Kotlin 的基本數(shù)值類型包括 Byte督惰、Short、Int旅掂、Long赏胚、Float、Double 等商虐,注意哦觉阅!這里是Int不是Integer,而且字符在Kotlin中屬于一個特殊的數(shù)據(jù)類型。在Kotlin中聲明變量的方式和Java也有一定的差別如下

Kotlin定義常量和變量

var name: String = "李四"http://變量秘车,可以多次賦值
val age: Int = 24//常量
val sex="男"http://支持類型自動檢測

在Kotlin中變量和常量通過var和val區(qū)分典勇,而且Kotlin沒有分號的,沒有分號的叮趴,沒有分號的,(真不是在湊字?jǐn)?shù)...)割笙,上面說到變量name不可為空,因為Kotlin中變量可空需要在后面加?

 var name: String ? = "李四"http://

這也就是Kotlin中防止空指針的方法眯亦,?的作用類似Java中的裝箱吧(不明白裝箱的自行解決)咳蔚。

Kotlin中定義方法(靜態(tài)方法)

fun test(a: Int): Unit {
//方法用fun修飾,括號中內(nèi)容為參數(shù)類型搔驼,多個參數(shù)用逗號隔開,Unit為參數(shù)類型 類似void 可以省略
}

//Kotlin中靜態(tài)方法采用companion包裹
companion object {

        fun getName() {

        }

        fun getStatic(string: String): String? {
            return null
        }
    }

Kotlin中定義類(靜態(tài)類)

Kotlin中類的定義和Java差不多侈询,不過從上面定義靜態(tài)方法應(yīng)該知道Kotlin中有關(guān)靜態(tài)的定義和Java也是有差異的舌涨,Kotlin中靜態(tài)類定義如下

object Demo {
    ......
//在Kotlin中靜態(tài)類中的所有方法均為靜態(tài)方法,而在其他類中調(diào)用靜態(tài)類中的方法不能直接通過
//`類名.方法名()`調(diào)用,調(diào)用格式如下  `類名.INSTANCE.方法名()`
    
}

數(shù)據(jù)之間的比較

在Kotlin中通過==來判斷值是否相等囊嘉,通過===判斷內(nèi)存地址是否相等温技,下面走進(jìn)第一個坑...

方法一
fun office() {
    val a: Int = 10000//127
    val boxedA: Int = a
    val anotherBoxedA: Int = a
    Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
    Log.e(Tag, (boxedA==anotherBoxedA).toString())//true
}

這里定義了3個常量,且這3個常量不可為空扭粱,(就好比int類型不可以為空),boxedAanotherBoxedA值與內(nèi)存地址均相等說明這2個變量是對同一個內(nèi)存地址的引用


方法二
fun office() {
    val a: Int? = 10000//127
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
    Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
}

這里定義了3個可為空的常量(Integer對象可以為空這個能理解吧)舵鳞,boxedAanotherBoxedA值與內(nèi)存地址均相等說明這2個變量是對同一個內(nèi)存地址的引用,


方法三
fun office() {
    val a: Int = 10000//127
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    Log.e(Tag, (boxedA === anotherBoxedA).toString())//-128-127為true其余為false
    Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
}

這里一開始我是不明白的boxedAanotherBoxedA的內(nèi)存地址是否相等根據(jù)a的值來確定琢蛤,查了一下比較合理的解釋就是JVM把[-128,127]的所有int數(shù)字全部緩存了蜓堕,任何指向這個范圍的對象,都不可能被另外"創(chuàng)建"博其,自然不能“裝箱”

官方文檔是不太合理的套才,它只給了1000這個數(shù)。

數(shù)據(jù)之間的轉(zhuǎn)換

Kotlin中不能像Java一樣將一個小的數(shù)據(jù)類型賦值給大的數(shù)據(jù)慕淡,精度也一樣

val b: Byte = 1 // Kotlin中數(shù)據(jù)類型支持自動檢測哦
val i: Int = b // 錯誤
val z:Int=b.toInt()//正確

val c : Float = 1.123F
val d: Double = c//錯誤
val d: Double = c.toDouble()//正確

字符串操作

Kotlin中字符串的操作處理得還是很好的不用斷斷續(xù)續(xù)的去用加號和雙引號連接背伴,$表示一個變量或者變量值

fun stringStitch(){
    val mils = 100
    val sentenceOne = "if you miss the train i on"

    //字符串和其他類型的的數(shù)據(jù)加$號直接拼接 $mils表示常量的值而非一個字符串  
    val sentenceTwo = "hundred mils or $mils mils"
    Log.e(Tag, sentenceTwo)//打印hundred mils or 100 mils

    //replace直接查找替換字符串中對應(yīng)的內(nèi)容
    sentenceOne.replace("train", "bus")
    Log.e(Tag, sentenceOne)//打印if you miss the train i on

    //額  算是多段拼接吧  字符串中的表達(dá)式通過${...}表示
    Log.e(Tag, "sentenceOne is $sentenceOne ,but now sentenceOne is ${sentenceOne.replace("train", "bus")}")
    //打印sentenceOne is if you miss the train i on ,but now sentenceOne is if you miss the bus i on
}

區(qū)間

和Java不同,Kotlin中舍棄了Java中for(變量初始化;循環(huán)條件;迭代語句)的結(jié)構(gòu)峰髓,所以在這里先說一下區(qū)間的表示方式傻寂,Kotlin中可以用a..b表示某一個升序的區(qū)間,如果需要表示一個降序的區(qū)間采用a downTo b携兵,此外Kotlin中區(qū)間中的數(shù)據(jù)還支持指定步長 a..b step疾掰,區(qū)間的開閉采用util表示

fun range() {
    for (key in 1..9) {
        //打印1-9
    }
    for (key in 1..9 step 3) {
        //打印1-4-7 步長為3
    }
    for (key in 1 until 9) {
        //依然表示區(qū)間,包含開頭不包含結(jié)尾眉孩,一個左閉右開的區(qū)間
    }
    for (key in 9 downTo 1) {
        //Kotlin默認(rèn)只支持升序
    }
}

數(shù)組

數(shù)組的創(chuàng)建方式包括以下兩種个绍,前面講過Kotlin中不支持?jǐn)?shù)據(jù)類型的直接轉(zhuǎn)換,所以在Kotlin中數(shù)組是不可型變的浪汪,

fun aboutArray() {
    val arrayA: Array<Int> = arrayOf(1, 2, 3)//[1,2,3]
    val arrayB = Array(3, { i -> (i + 10) * 2 })//params_one->數(shù)組長度 params_two->表達(dá)式{}為空則數(shù)組為空 默認(rèn)i為0
    for (key in 0 until arrayB.size) {
        Log.e(Tag, arrayB[key].toString())
    }
    arrayA.distinct()//數(shù)組去重
    var toSet:Set<Int> = arrayA.toSet()//數(shù)組去重巴柿,并分會set集合
}

第一種val arrayA: Array<Int> = arrayOf(1, 2, 3)長度固定不可數(shù)據(jù)類型不可變
第二種val arrayB = Array(3, { i -> (i + 10) * 2 })Array中的兩個參數(shù)分別說明以下,3表示數(shù)組的長度死遭,第二個參數(shù){ i -> (i + 10) * 2 }广恢,主要在于理解后半部分,這里i的值從0開始按照(i + 10) * 2的方式變化呀潭,每次i的值自增1钉迷,則數(shù)組中類容為[20,22钠署,24]糠聪。

條件語句

這個暫時好像沒什么好說的,只需要注意一點Kotlin中if語句可以作為表達(dá)式來使用比如下面的示例谐鼎,var value = if (a!! > b) a else b舰蟆,以及區(qū)間在if語句中的運用

fun aboutTrinityOperator() {
    //int c = 1 > 2 ? 1 : 2;  //Java中三目運算符
    @Suppress("CanBeVal")
    var a: Int? = 1
    val b = 2
    //補充一下前面沒有寫到的一個內(nèi)容 Kotlin中將一個對象轉(zhuǎn)換為數(shù)據(jù)類型使用 !! 拋出空指針(),類似Java中出箱
    var value = if (a!! > b) a else b
    //Java中寫法
    if (a >= 10 || a <= 20) {

    }
    //結(jié)合區(qū)間的寫法
    if (a in 10..20) {
        
    }
}

循環(huán)語句

這個比較尷尬 Kotlin中廢除了Java中for(初始值;條件;變化趨勢)的規(guī)則,增加一些如下關(guān)鍵字

  • downTo 遞減
  • step 步長 默認(rèn)步長為1
  • until 左閉右開
  • 等等...

總的來說感覺for循環(huán)在Kotlin中沒有Java中好用了身害,不過 while循環(huán)可以代替for循環(huán)具體用法往下看吧

fun aboutFor() {
    var arrayA: Array<Int> = arrayOf(1, 2, 3, 4, 5)
    var arrayB: Array<String> = arrayOf("a", "b", "c")

    //直接遍歷所有元素
    for (item in arrayA) {
        //打印arrayA中所有元素
    }

    //遍歷區(qū)間1-98  步長為3
    for (item in 1 until 99 step 3) {
        //打印 1 4 7 10 步長為3 類似 for(...;...;i=i+3){}
    }
    //遍歷區(qū)間遞減
    for (item in 99 downTo 1 step 2) {
        //打印99-97-95....
    }
    for (item in 10 until 1) {//無法執(zhí)行  util僅僅支持升序
        Log.e(Tag, item.toString())
    }

    //根據(jù)數(shù)據(jù)的下標(biāo)進(jìn)行遍歷
    for ((index, value) in arrayB.withIndex()) {
        Log.e(Tag, "the element at $index is $value")//0-3
    //打印內(nèi)容如下:the element at 0 is a
    //the element at 1 is b
    //the element at 2 is c
    }

}

感覺就是foreach循環(huán)的強(qiáng)化版...有木有味悄?,while和do..while循環(huán)的話差不多就不寫了塌鸯,上面主要是語法上的一些不同侍瑟,第一次在簡書上發(fā),好緊張...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丙猬,一起剝皮案震驚了整個濱河市涨颜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淮悼,老刑警劉巖咐低,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袜腥,居然都是意外死亡见擦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門羹令,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲤屡,“玉大人,你說我怎么就攤上這事福侈【评矗” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵肪凛,是天一觀的道長堰汉。 經(jīng)常有香客問我,道長伟墙,這世上最難降的妖魔是什么翘鸭? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮戳葵,結(jié)果婚禮上就乓,老公的妹妹穿的比我還像新娘。我一直安慰自己拱烁,他們只是感情好生蚁,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戏自,像睡著了一般邦投。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擅笔,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天尼摹,我揣著相機(jī)與錄音见芹,去河邊找鬼。 笑死蠢涝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阅懦。 我是一名探鬼主播和二,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耳胎!你這毒婦竟也來了惯吕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怕午,失蹤者是張志新(化名)和其女友劉穎废登,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郁惜,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡堡距,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兆蕉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羽戒。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虎韵,靈堂內(nèi)的尸體忽然破棺而出易稠,到底是詐尸還是另有隱情,我是刑警寧澤包蓝,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布驶社,位于F島的核電站,受9級特大地震影響测萎,放射性物質(zhì)發(fā)生泄漏亡电。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一绳泉、第九天 我趴在偏房一處隱蔽的房頂上張望逊抡。 院中可真熱鬧,春花似錦零酪、人聲如沸冒嫡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孝凌。三九已至,卻和暖如春月腋,著一層夾襖步出監(jiān)牢的瞬間蟀架,已是汗流浹背瓣赂。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留片拍,地道東北人煌集。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像捌省,于是被迫代替她去往敵國和親苫纤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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

  • 前言 人生苦多纲缓,快來 Kotlin 卷拘,快速學(xué)習(xí)Kotlin! 什么是Kotlin祝高? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,218評論 9 118
  • Google在今年的IO大會上宣布栗弟,將Android開發(fā)的官方語言更換為Kotlin,作為跟著Google玩兒An...
    藍(lán)灰_q閱讀 76,924評論 31 489
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法工闺,類相關(guān)的語法乍赫,內(nèi)部類的語法,繼承相關(guān)的語法斤寂,異常的語法耿焊,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司遍搞,掛了不少罗侯,但最終還是拿到小米、百度溪猿、阿里钩杰、京東、新浪诊县、CVTE讲弄、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,277評論 11 349
  • 人們每天都在尋找,尋找屬于自己的天空依痊,忙碌的腳步從不停下休息避除,也從不思考人生。 找了好久胸嘁,問了好久...
    春去落花閱讀 197評論 0 0