Kotlin學(xué)習(xí)(一)基礎(chǔ)

Kotlin


kotlin來源
Kotlin 來源于一個島嶼的名字,全稱是 Kotlin Island,是英語「科特林島」之意,這個小島屬于俄羅斯。

2010 年 :JetBrains 著手開發(fā) Kotlin。
2011 年 7 月 :JetBrains 公開宣布 Kotlin。
2012 年 2 月 :JetBrains 在 Apache 2 許可證下開源了 Kotlin 的源碼。目前 Kotlin 的官方源代碼在 Github 上 https://github.com/JetBrains/kotlin 。
2016 年 2 月 :JetBrains 發(fā)布了 Kotlin 1.0 版,算是比較穩(wěn)定的正式版。許諾之后一直會保持向后兼容。
2017 年目前最新版本 :1.1.2(2017 年 6 月)。相比 Kotlin 1.0 版本時,和 Kotlin 有關(guān)的代碼數(shù)目從 210 萬行飛升到 1000 多萬行。
2017.05.08Google I/O大會宣布Kotlin作為Android官方開發(fā)語言,親兒子。。

Kotlin和java一樣是基于JVM的語言


kotlin與java7相比 優(yōu)勢到底是什么?

  • 它更加易表現(xiàn):這是它最重要的優(yōu)點(diǎn)之一。你可以編寫少得多的代碼。
  • 它更加安全:Kotlin是空安全的,也就是說在我們編譯時期就處理了各種null的 情況,避免了執(zhí)行時異常。如果一個對象可以是null,則我們需要明確地指定 它,然后在使用它之前檢查它是否是null。你可以節(jié)約很多調(diào)試空指針異常的 時間,解決掉null引發(fā)的bug。
  • 它是函數(shù)式的:Kotlin是基于面向?qū)ο蟮恼Z言。但是就如其他很多現(xiàn)代的語言 那樣,它使用了很多函數(shù)式編程的概念,比如,使用lambda表達(dá)式來更方便地 解決問題。其中一個很棒的特性就是Collections的處理方式。
  • 它可以擴(kuò)展函數(shù):這意味著我們可以擴(kuò)展類的更多的特性,甚至我們沒有權(quán)限 去訪問這個類中的代碼。
  • 它是高度互操作性的:你可以繼續(xù)使用所有的你用Java寫的代碼和庫,因?yàn)閮?個語言之間的互操作性是完美的。甚至可以在一個項(xiàng)目中使用Kotlin和Java兩 種語言混合編程。
  • 它可以多平臺開發(fā):基于 JVM 的開發(fā),Android 開發(fā),Web 開發(fā),Native(原生)開發(fā)。其中 Web 開發(fā)可以結(jié)合 spring 框架,而且 Kotlin 也可以編譯生成 JavaSript 模塊,可以在一些 JavaScript 的虛擬機(jī)上編譯。Native 開發(fā)就更牛了,目前 Kotlin 官方在 Github 開源了 Native 開發(fā)的源碼 https://github.com/JetBrains/kotlin-native,基于 LLVM(Low Level Virtual Machine 的縮寫,表示「底層虛擬機(jī)」。LLVM 是一種編譯器基礎(chǔ)設(shè)施,以 C++ 寫成。它是為了任意一種編程語言而寫成的程序,利用虛擬技術(shù)創(chuàng)造出編譯時期、鏈接時期、運(yùn)行時期以及閑置時期的最優(yōu)化)的后端,方便為各個平臺編寫原生應(yīng)用,比如為 Mac OS,iOS,Linux,嵌入式系統(tǒng),等等

參考資料:http://blog.csdn.net/weixin_37730482/article/details/73558216


基本類型

1.kotlin支持的基本類型:
Double Float Long Int Short Byte
<!--其中Byte不是數(shù)值類型, kotlin中每個類型都是一個對象, kotlin不支持8進(jìn)制-->

數(shù)字類型不會自動轉(zhuǎn)型,比如 不能給Long類型變量分配一個Int值,如果要賦值一個Int類型的必須要做明確的類型轉(zhuǎn)換,每一種基礎(chǔ)類型都有轉(zhuǎn)型的方法:

val int :Int = 1
val long :Long =i.toLong()

在kotlin中定義變量時使用(kotlin中聲明變量有兩種方式,使用var聲明的是可變變量,可以重新賦值,val聲明的類似java中的final修飾的常量):

var c = 'c'//kotlin中可以通過值推斷出變量的類型,所以我們的類型通??梢允÷缘?var int = 12
var long =121L
val string = "hello,wordl"http://不可變變量

數(shù)值類型的變量支持添加下劃線:

val one_million = 1_000_000
val id_card=411_325_1988_0926_5036L

字符(char) 不能直接作為一個數(shù)字處理,在使用時可以轉(zhuǎn)換為一個數(shù)字

val c :Char = 'c'
cal cToInt :Int = c.toInt()
2.數(shù)組:

數(shù)組 在kotlin中 數(shù)組由Array類表示,我們可以通過arr

ayOf(1,2,3)這種方式來創(chuàng)建數(shù)組:

    var array: Array<Int> = arrayOf(1, 2, 3)
var arrayOfNulls: Array<Int?> = arrayOfNulls(5)//可以指定一個定長的空數(shù)組
var arrayOfIndex: Array<Int> = Array(5, { i -> (i * i) })//可以構(gòu)建一個通過數(shù)組索引產(chǎn)生數(shù)組元素值的數(shù)組
3.String 字符串

kotlin中的字符串字面量分為兩種

val s = "hello , world \n" 
// 一種是""包裹的,這種字符串與java里的String 類似  可以識別轉(zhuǎn)義字符

//另一種是不識別特殊字符,寫什么就是什么的 字符串   所以這個注釋不能跟到下面一行的后面- -
 val text = """
     for(c in "foo"){
     print(c)
     }
     \r  \n
        """http://上面這個字符串可以用trimMargin來去除開頭的空格
  text.trimMargin()

字符串模版

println("text = $text1")//可以直接用$跟變量
println("text = ${text1.length}")//也可以直接用${}包裹表達(dá)式

一個String可以像數(shù)組那樣被迭代訪問:

    val string  = "Hello,World"
    val c = string[2]//這是字符'l'
    for(c in string){
    println(c)
    }

屬性

Kotlin中的屬性與java中的屬性相同,不過屬性自實(shí)現(xiàn)了getter和setter。如果沒有任何制定,屬性會默認(rèn)使用getter和setter

class Person{
    var name :String = ""
}
    val person = Person()
    person.name = "lisi"http://Kotlin中默認(rèn)已經(jīng)實(shí)現(xiàn)了getter setter
    val name = person.name

如果想要修改默認(rèn)的getter 和 setter,可以這樣做:

class Person{
        var name :String = ""
        get() = field.toUpperCase()
        set(value) {
            field = "Name:$value"
        }
    }

修改了getter和setter之后,就會再調(diào)用屬性時按照修改后的調(diào)用getter和setter

當(dāng)我們直接調(diào)用屬性的時候不是直接訪問類的屬性,而是調(diào)用了getter 和setter方法。



Android中的耗時操作需要在子線程中運(yùn)行,使用java時可以通過new Thread 或者Rxjava來進(jìn)行異步處理。

在kotlin中,使用Anko庫可以

async{
    Request("url"
    ).run()//在子線程運(yùn)行的

    uiThread { toast("request success") }//uiThread是在主線程中運(yùn)行的,uiThread可以依賴于調(diào)用者,如果它是被一個Activity調(diào)用的,
    //如果activity.isFinishing()返回true,uiThread就不會被執(zhí)行了。這樣就不會在Activity銷毀時崩潰了。
        }

修飾符

可見性修飾符
Kotlin中的可見性修飾符與java中有一些不同,
kotlin修飾符有五種 :

public private protected default//和java一樣的四種

internal// kotlin多出了一種模塊module級別的internal,一個module中不能跨module訪問方法和變量

在Kotlin中默認(rèn)的可見性修飾符是public


Kotlin中的null安全

在java中 類似 String nullStr = null; nullStr.length() ;
該代碼可以被編譯,但是在運(yùn)行時會拋出NullPointerException,這樣相當(dāng)不安全

指定一個變量是可null是通過在類型的最后增加一個問號,因?yàn)樵趉otlin中一切都是對象,一切都是可null的。

val a : String? = null

一個可null類型,在沒有進(jìn)行檢查之前你是不能直接使用它的()。還有一個特性是當(dāng)我們檢查了一個對象的可null性,之后這個對象就會自動轉(zhuǎn)型成不可null類型。這就是kotlin編譯器的智能轉(zhuǎn)換。
(Kotlin for android developer 140)
如果我們不需要是用null引用,可以使用安全訪問操作符(?),使用之后只有引用不為null才會執(zhí)行代碼,否則不做任何操作。
我們可以使用Elivs Operator(?:),類似三元表達(dá)式

val length = a?.length?:-1
//如果不為null,返回a.length,如果為null返回-1

有一種情況是,我們明確的知道我們使用的是不null變量,但是他的類型卻是可null的。我們可以直接是用!!操作符強(qiáng)制編譯器執(zhí)行可null類型時跳過限制檢查。

val a :String? = null;
a!!.length//這里明顯會崩潰,所以我們使用!!來強(qiáng)制執(zhí)行的時候,要確保對象非null。
<!--KotlinNullPointerException-->
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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