java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则
前言
以一個(gè)java老鳥的角度,如何去看 kotlin。 Java源代碼應(yīng)該如何用Kotlin重構(gòu)。 如何正確學(xué)習(xí)kotlin并且應(yīng)用到實(shí)際開發(fā)中。本文將會(huì)探究。
本文分兩大塊,重難點(diǎn)和潛規(guī)則。
重難點(diǎn):Kotlin中可以獨(dú)立出來講解的大塊知識點(diǎn)。提供單獨(dú)Demo。這部分大多數(shù)是Kotlin開創(chuàng)的新概念(相比于Java)。
潛規(guī)則:Kotlin是谷歌用來替換Java的,它和java百分百完全兼容,但是實(shí)際上java轉(zhuǎn)成kotlin之后,需要我們手動(dòng)修改很多東西,甚至某些部分必須打散重構(gòu)來達(dá)到最優(yōu)編碼。其中,kotlin的某些特性和java不同,甚至完全反轉(zhuǎn)。這部分知識點(diǎn)比較零碎,單獨(dú)Demo不方便提供,就以小例子的形式來寫。
- 重難點(diǎn)lambda以及操作符高階函數(shù)以及操作符Kotlin泛型集合操作協(xié)程操作符重載
- 潛規(guī)則Kotlin文件和類不存在一對一關(guān)系共生體繼承修飾符空指針問題
潛規(guī)則
從Java轉(zhuǎn)到kotlin,基本上都會(huì)存在java代碼與kotlin共存的問題。而且為了快速轉(zhuǎn)型,可能會(huì)直接把java類轉(zhuǎn)成kotlin類,而這個(gè)過程中,涉及到j(luò)ava和kotlin的交互,往往會(huì)磕磕碰碰,以下總結(jié)了一部分 java kotlin交互方面的問題.
Kotlin文件和類不存在一對一關(guān)系
kotlin的文件,可以和類名一致,也可以不一致。這種特性,和c++有點(diǎn)像,畢竟c++的.h 和 .cpp文件是分開的。只要最終編譯的時(shí)候?qū)Φ纳?#xff0c;文件名其實(shí)無所謂的。Java中,一個(gè)類文件的類名和文件名不一致,如果是public類,就會(huì)報(bào)異常。
在kotlin中,可以寫成一致,如:
不一致:
這樣做的意義在于:
如果有很多個(gè)行數(shù)很短的類:在java中可能要占用大量的文件個(gè)數(shù)(Java中可以用內(nèi)部類的形式解決),kotlin中則可以把這些類都放到同一個(gè)kt文件中,不用內(nèi)部類也能解決。
共生體
Java中的靜態(tài) static關(guān)鍵字,在kotlin中不復(fù)存在,作為替換,Kotlin提出了共生體的概念。如果是kt文件去調(diào)用kt類的“靜態(tài)”方法(不依賴對象),則要求后者的類結(jié)構(gòu)中增加一個(gè) companion object 成員變量。并且可以在 成員中寫上 你想要定義的"靜態(tài)"成員變量和成員方法
class Test001(_name: String) : Person(_name) { companion object { const val s: String = "" const val s2: String = "" fun t1(){ } }}fun main(){ Test001.s Test001.t1()}注:每一個(gè)kotlin類中,只能有一個(gè)共生體對象.
但是在java調(diào)用kt的"靜態(tài)"成員方法時(shí),必須帶上共生體,但是,訪問"靜態(tài)"成員變量,則不能帶:
public static void main(String[] args) { Test001.Companion.t1();//Java訪問kt的t1()共生體方法,必須帶上Companion String s2 = Test001.s;// 而訪問共生體成員變量,不能帶Companion }好糾結(jié)。為什么要這么設(shè)計(jì)。算了。查了一下kt反編譯之后的Java源碼:
共生體變成了Java類中的靜態(tài)內(nèi)部類,包含t1()方法。而s,s2 則是普通的靜態(tài)變量。
修飾符
修飾符指的是 類 和 成員變量,成員方法 前面的 權(quán)限訪問關(guān)鍵字。原 Java擁有 private ,protected,default ,public ,訪問權(quán)限分別為: 本類內(nèi)部,同包名或子類,同包名,全局。
然而,kotlin新增了一個(gè)概念,internal ,表示,相同Module內(nèi)可訪問,跨Module則不行。
并且,java和kotlin的 private ,protected,default ,public 的訪問權(quán)限還有區(qū)別,但是我這里就不詳述了,因?yàn)槲矣X得意義不大。能不能訪問,寫代碼的時(shí)候編譯器會(huì)告訴你,當(dāng)場警告你,你就會(huì)修改代碼。如果有問題。可以把kotlin Decompile成Java代碼自己去對比試試。如有需要,后期再說吧。
空指針問題
通常要快速的將 舊java代碼轉(zhuǎn)化成kotlin代碼,是拷貝java代碼粘貼到kotlin文件內(nèi),讓as自動(dòng)轉(zhuǎn)化,但是這種方式,容易造成很多空指針問題,有一些是很直白的報(bào)了編譯錯(cuò)誤,而有一些則是隱藏起來,等到程序運(yùn)行時(shí)才會(huì)報(bào)錯(cuò)。直接報(bào)錯(cuò)的就不提了,下面演示隱藏的空指針問題:
Kotlin類:
class Student(name:String) { var name: String = name fun showName(tag: String) { println("$tag : $name") }}Java調(diào)用kt:
public class Main { public static void main(String[] args) { Student s = new Student("zhou"); s.showName(null); }}此時(shí),如果運(yùn)行main函數(shù),就會(huì)報(bào)出:
告訴我們參數(shù)tag不可為null。但是奇怪的是,在java代碼中,居然不會(huì)報(bào)編譯錯(cuò)誤。賊特么詭異。
解決方案:
在方法參數(shù)后面加上問號,變成這樣:
沒有基本數(shù)據(jù)類型
Kotlin之中沒有基本數(shù)據(jù)類型,它只有:Int,Short,Long,Float,Double,Byte ,Char,Boolean 這樣的包裝類型。為什么沒有?沒有必要去糾結(jié),但是只提供包裝類型有一個(gè)好處,那就是 方便擴(kuò)展函數(shù)的定義。我們可以很輕松地對 Int,類型去擴(kuò)展函數(shù)。比如: Kotlin自帶了很多擴(kuò)展函數(shù):
這是系統(tǒng)定的,我們也可以自己來定義:
fun Int.plus100(): Int {//自定義擴(kuò)展 return this + 100}fun main() { val a: Int = 20 println("${a.plus100()}")}繼承
在用kt重構(gòu)部分模塊的過程中,我發(fā)現(xiàn)頻繁出現(xiàn)下面的問題:
Kotlin基類:
abstract class Person(name: String) { var name: String? = name}Java子類:
由于我是從基礎(chǔ)類開始重構(gòu),所以,在原先的Java代碼中頻繁出現(xiàn)了類似這種 訪問權(quán)限不足的問題。一個(gè)一個(gè)去改成setName函數(shù),工作量巨大。后來找到一個(gè)辦法:
在kotin中加入 @JvmField 變成這樣:
abstract class Person(name: String) { @JvmField var name: String? = name}@JvmField可以讓 kotlin的成員屬性變成公有的,kt轉(zhuǎn)化成java時(shí),會(huì)是如下這樣:
public abstract class Person { @JvmField @Nullable public String name; public Person(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); this.name = name; }}兼容原先的Java代碼。不用大面積修改了。
默認(rèn)支持可選命名參數(shù)
了解高級語言語法的同學(xué)肯定知道 可選命名參數(shù)和 可選位置參數(shù),經(jīng)測試: Kotlin的任何方法(包括構(gòu)造方法和普通和方法),可以這么寫:
fun test001(s: String, s1: String) { println("$s - $s1")}fun main() { test001(s = "1111", s1 = "2222") //臥槽,Kotlin默認(rèn)支持 可選命名參數(shù)}這種特性可以很好的避免了Java中出現(xiàn)的一個(gè)方法包含N個(gè)參數(shù) 把人眼睛看花的情況:
private void test(String s1, String s2, String s3, String s5, String s6, String s7, String s8, String s9, String s10, String s11, String s12) { //... }比如如上面所示,一個(gè)方法,有12個(gè)String參數(shù),看多了會(huì)罵娘,誰特么寫的。然而,用kotlin:
fun test(s1: String, s2: String, s3: String, s4: String, s5: String, s6: String, s7: String, s8: String, s9: String, s10: String, s11: String, s12: String) {}fun main() { test(s1 = "",s2 = "",s3 = "",s4 = "",s5 = "",s6 = "",s7 = "",s8 = "",s9 = "",s10 = "",s11 = "",s12 = "")}直覺上這種語法,融入了 建造者設(shè)計(jì)模式。讓同一個(gè)函數(shù)的多個(gè)參數(shù)不再混亂。當(dāng)然如果你懷舊的話,你也可以用原始方法,12個(gè)string依次擺下去。反正我不會(huì)這么做。
類,成員方法 默認(rèn)封閉
和Java相反,kotlin給類,成員方法 都采用了默認(rèn)封閉原則。具體體現(xiàn)為:類,默認(rèn)不可繼承,成員方法默認(rèn)不可重寫(繼承時(shí))。如果要繼承類,或者重寫父類方法,必須在父類中手動(dòng)加入 open 關(guān)鍵字,子類中重寫方法必須加上override關(guān)鍵字 :
kotlin父類:
open class Student(name:String) { var name: String = name open fun showName(tag: String?) { println("$tag : $name") }}kotlin子類:
class StudentExt(name: String) : Student(name) { override fun showName(tag: String?) { super.showName(tag) println("xxxxx") }}Kotlin中方法和函數(shù)的區(qū)別
函數(shù),是c/c++的詞匯,而方法,則是Java里面。現(xiàn)在kotlin中同時(shí)存在了方法和函數(shù),那么區(qū)別在哪里?
通常我們?nèi)藶?#xff1a;在Kotlin類內(nèi)部,稱為成員方法。而在類外部定義的,則成為全局函數(shù)(這里就不用去討論kotlin變成java之后長什么樣)。
應(yīng)用到具體場景,一句話解釋清楚:
A.kt 中有一個(gè)A類,它有a()成員方法。 同時(shí)我們可以在 B.kt中給A類擴(kuò)展一個(gè)函數(shù)。創(chuàng)建一個(gè)A類對象之后,我們既可以調(diào)用a()成員方法,又可以調(diào)用它的擴(kuò)展函數(shù)。
A.kt
class A { fun a() {}}B.kt
fun A.foo(){}// 擴(kuò)展A的一個(gè)函數(shù)fun main() { val a = A()//創(chuàng)建對象 a.a() //調(diào)用成員方法 a.foo() //調(diào)用擴(kuò)展函數(shù)}結(jié)語
Java轉(zhuǎn)kotlin,給我的感覺就是:
參考資料
Kotlin in Action 下載pdf書籍:(https://www.7down.com/soft/209822.html)
菜鳥教程: https://www.runoob.com/kotlin/kotlin-tutorial.htmlkotlin
中文站: https://www.kotlincn.net
最后,今天的分享到這里就結(jié)束了,小編這里也給大家整理了一份阿里的資源文檔,算是當(dāng)做福利送給大家吧。
免費(fèi)領(lǐng)取方式,本文轉(zhuǎn)發(fā)+關(guān)注后私信:資料 即可
這里小on 祝大家學(xué)業(yè)昌隆哦!!!
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写html前端代码的软件_html用什么
- 下一篇: DFT C 语言