秒懂Kotlin之Java工程師快速掌握Kotlin的技巧_第1頁
秒懂Kotlin之Java工程師快速掌握Kotlin的技巧_第2頁
秒懂Kotlin之Java工程師快速掌握Kotlin的技巧_第3頁
秒懂Kotlin之Java工程師快速掌握Kotlin的技巧_第4頁
秒懂Kotlin之Java工程師快速掌握Kotlin的技巧_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第秒懂Kotlin之Java工程師快速掌握Kotlin的技巧Kotlin是一種在Java虛擬機(jī)上運行的靜態(tài)類型編程語言,被稱之為Android世界的Swift,由JetBrains設(shè)計開發(fā)并開源。

Kotlin可以編譯成Java字節(jié)碼,也可以編譯成JavaScript,方便在沒有JVM的設(shè)備上運行。

在GoogleI/O2017中,Google宣布Kotlin成為Android官方開發(fā)語言。

Kotlin/JVM可以看做是對改進(jìn)Java的一種積極的嘗試,其試圖改進(jìn)Java編程語言中已知的被廣泛討論的缺點與不足。因為我多年前從事過C#的開發(fā),初次看到Kotlin,感覺好多特性C#好多年前就有了。足見Java是多么的傳統(tǒng),不愿意過多的引入語法糖。

關(guān)于Kotlin與Java的愛恨情仇此處按下不表,等有機(jī)會單獨寫一篇相關(guān)文章。本文僅想從Java慣用者的角度給出Kotlin與Java的一些不同點,這往往對Java慣用者迅速掌握Kotlin是至關(guān)重要的。因為Kotlin是對Java的一種改進(jìn),其與Java是100%互操作的,所以Java程序員經(jīng)過短暫的熟悉后往往可以快速入門,進(jìn)而熟練掌握Kotlin。

人類學(xué)習(xí)新事物的一個很重要的方法就是類比,如果新事物與舊事物相似性非常大,那么類比學(xué)習(xí)的效果會更加明顯,從Java到Kotlin非常符合這個特征,以你熟悉的Java來類比不熟悉的Kotlin將會事半功倍,讓我們開始吧。

本文基于Kotlin1.4.0版本

Kotlin與Java在語法上存在一些差異,不算特別巨大,下面列出了我認(rèn)為最需要適應(yīng)的幾條:

Kotlin中的方法和屬性可以不包含在類中

我們知道,Java中的一切是以class為基礎(chǔ)的,都要在class中,但是Kotlin卻不是。下面的代碼中,方法、屬性以及類共存于同一級,同一個文件中都是允許的。

varname:String="ShuSheng007"

funsum(x:Int,y:Int):Int{

returnx+y

classStudent{}

Kotlin中語句不需要以;結(jié)束

println("helloworld")

Kotlin中數(shù)據(jù)類型是后置的

//變量聲明時類型后置

varname:String="ShuSheng007"

//方法參數(shù)及返回值類型后置

funsum(x:Int,y:Int):Int{

returnx+y

}

Kotlin方法使用fun關(guān)鍵字定義

funsum(x:Int,y:Int):Int{

returnx+y

}

Kotlin的類和方法默認(rèn)是publicfinal的

類默認(rèn)不可以被繼承,基類中的方法默認(rèn)不可以被重寫,如果想要被繼承或者重寫需要用open關(guān)鍵字標(biāo)記

//Human類可以被繼承

openclassHuman{

//eat方法可以被overwrite

openfuneat(){

}

Kotlin中類繼承和接口實現(xiàn)使用:標(biāo)記

//類繼承

classMan:Human(){

overridefuneat(){

super.eat()

//實現(xiàn)接口

interfaceaction{

funsleep()

classWoman:action{

overridefunsleep(){

//...

}

Kotlin中使用var,val聲明變量及屬性,而且可以進(jìn)行類型推斷

在Java中,我們聲明一個變量必須先指定其類型,例如

Stringname="shusheng007";

但是在Kotlin中,編譯器可以根據(jù)賦值自動推斷其類型為String

varname="shusheng007"

Kotlin存在非空與可空類型

這個也是其宣傳的一大亮點,嘗試去解決價值幾十億美金的問題:NullPointerException

在Kotlin中每個對象默認(rèn)都是非null的,除非你顯式的將其聲明為可null

//非空類型

varname1:String="shusheng"

//可空類型

varname2:String=null

Kotlin中package可以與文件路徑不一致

什么意思呢?假設(shè)我們有個類文件在src/…/top/ss007/learn文件路徑中

那么對于Java此類的包名必須為

packagetop.ss007.learn

而對于Kotlin來說就沒有這個限制,可以隨便叫,例如叫:就是這么任性

packagejust.so.wayward

確實挺任性的,所以這點建議還是遵守Java的規(guī)范更好。

Kotlin中沒有受檢異常(CheckedException)

在Java中有很多受檢查異常,程序員被強(qiáng)制要求處理它,或者拋給下層調(diào)用者處理。但是Kotlin沒有這個限制。

Kotlin強(qiáng)調(diào)不可變的概念

Kotlin會優(yōu)先使用不可變對象,例如不可變的集合,不可變的變量。這些不可變對象生成后就只能讀取,而不能修改。至于使用不可變對象有很多好處,例如其天然的線程安全性等

以上幾條是個人認(rèn)為的最顛覆我們認(rèn)知的差異點,熟悉了上面幾條后Java程序員就基本上可以看得懂kotlin的代碼了

Java中不存在的特性

Kotlin中引入了很多Java中不存在的特性,下面是幾條我認(rèn)為比較重要的

方法類型(FunctionType)

在Kotlin中方法是一等公民,意思就是方法就和類一樣,類可以干的事,方法都可以干。方法竟然可以作為類型當(dāng)其他方法的參數(shù)傳遞,當(dāng)其他方法的返回值類型,當(dāng)變量的聲明類型…這個比較顛覆Java程序員的三觀,Java中是沒有對應(yīng)的概念的。如果非要找一個對應(yīng)物的話,那就是函數(shù)接口了。

下面是一個方法類型(兩個int數(shù)據(jù)得到一個int,例如1+2=3)。我們完全可以將其看成是java中的一個類,所有可以使用類的地方這家伙都適用,也就是說kotlin中,方法可以當(dāng)參數(shù)傳遞了,相當(dāng)于實現(xiàn)了方法引用,牛逼哄哄的。

(Int,Int)-Int

例如如下方法,第3個參數(shù)operation的類型就是上面的方法類型

funcalculate(x:Int,y:Int,operation:(Int,Int)-Int):Int{

returnoperation(x,y)

//如何調(diào)用

funsum(x:Int,y:Int):Int{

returnx+y

//將sum方法當(dāng)參數(shù)傳入了calculate方法中

calculate(4,5,::sum)

//我們也可以使用Lambda表達(dá)式

calculate(4,5,{a,b-a+b})

//當(dāng)Lambda表達(dá)式是方法的最后一個參數(shù)時,其可以移到()外面

calculate(4,5){a,b-a+b}

那么如何在Java中實現(xiàn)相同的功能呢?

第一步:按照需求定義一個函數(shù)接口

下面的接口只有一個抽象方法,是一個函數(shù)接口。

@FunctionalInterface

publicinterfaceFun2P1,P2,R{

Rinvoke(P1p1,P2p2);

}

第二步:將其作為方法參數(shù)類型

publicintjavaCalculate(intx,inty,Fun2Integer,Integer,Integeroperation){

returnoperation.invoke(x,y);

}

經(jīng)過上面兩步就搞定了。

當(dāng)在Kotlin中調(diào)用Java中的方法javaCalculate時,IDE會提示如下信息

第一條是告訴你第三個參數(shù)可以使用Kotlin中的函數(shù)類型,代碼如下

javaCalculate(4,5){a,b-a+b}

第二條是比較正統(tǒng)的,告知你需要一個類型為Fun2的參數(shù),代碼如下

javaCalculate(4,5,object:Fun2Int,Int,Int{

overridefuninvoke(p1:Int,p2:Int):Int{

returnp1+p2

})

在Java中我們使用new一個匿名類的對象,而在Kotlin中我們需要使用object關(guān)鍵字

屬性(Property)

varname:String="ShuSheng007"

對應(yīng)Java類里的私有字段(Field)外加getter和setter方法

privateStringname;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

=name;

}

數(shù)據(jù)類dataclass

dataclassUser(valname:String,valage:Int)

大體相當(dāng)于Java中的JavaBean,但有細(xì)微差別,這也是Kotlin大勢宣傳其簡潔性時經(jīng)常展示的看家特性

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論