Kotlin 基礎語法-01-基本知識-與java互調
前言:
Kotlin 語言在2017年被google 官方宣佈爲Andorid 開發的第一語言、 不可否認我們現在很多項目和一些老舊項目依然有很多人在使用Java 語言,但隨着未來慢慢的推廣和替代,kotlin 會逐漸取代上層Java語言開發的份額,由此可見我們學習kotlin 語言的重要性。
扯淡:
這一kotlin基礎語法系列適合有一定java語言語法和C或者C++ 基礎的讀者來閱讀, 文中可能有需要和其他語言進行類比。 先這,不想扯淡太多了,由於疫情影響,雖然是遠程辦公,但總覺得比去辦公室坐班還累,時間明顯不夠用,抱歉更慢了。
1. kotlin 的基本知識
kotlin文件後綴名是kt結尾, 類似這樣, demo.kt
變量名聲明方式:
var age : Int = 28
val name : String = "hello world , kotlin "
var address = " bei jing city .. "
kotlin 中 var 代表是可變類型, : 後邊爲變量類型, val 代表的是不可變類型, 當然如果後邊的數據類型 能夠自動推斷出數據類型並賦值類型給變量。 因此可以省去數據類型的表示。
另外kotlin是空安全類型, 嘛意思?
// var name:String = null
// 這麼着是聲明不成功的, 不允許空賦值
var name2:String? = null
// 這樣是可以的 、 String? 意思就是變量類型有可能爲空
var name = name2 // 這是不可以賦值的
var name = name2!! // 如果確認name2 一定不爲空 則可以這麼強轉。
注意String和String? 是不同的類型, String?可以給String 賦值、當然name2可以直接接受 name 的賦值 。
接下來 再看一下kotlin 的基礎語法
fun printStr(str: String):String{
println("str is $str")
return str
}
printStr("hello world kotlin")
打印結果:
str is hello world kotlin
2. kotlin 與Java代碼互調
學習kotlin免不了使用以前的java代碼 、那麼瞭解Java與kotlin 互調就會很重要, 簡單瞭解一下。
語法變化
kotlin 關鍵字處理
kotlin 是沒有封裝類的, 也就是說方法是可以直接寫在文件中的,舉個例子,
/// Utils.kt
fun echo(name:String){
println("$name")
}
/// Main.java
public static void main(String args[]){
UtilsKt.echo("hello java & kotlin");
}
文件名 + Kt.方法名() 這就是Java調用Kotlin方法的方式。 Utils這個文件中的所有變量和函數和方法 都會編譯成文件名Kt文件。 這樣就能解釋通爲什麼可以這麼調用了。
Java與Kotlin交互的語法變化
object Test{
fun sayHello(msg: String){
println(msg)
}
}
那麼怎麼調用呢
// Kotlin
Test.sayHello("hello kotlin")
/// java
Test.INSTANCE.sayHello("Hello java ")
object 修飾的Test會被編譯成一個靜態單例實例化instance 調用方式就是 類名.INSTANCE.方法名 。 當然這也是kotlin 中單例的一種寫法。
在java中我們常需要傳class ,比如Main.class
那麼在kotlin 中怎麼聲明呢
fun main(args: Array<String){
/// java Main
testPrintClass(JavaMain::class.java)
/// kotlin Main
testPrintKtClass(KotlinMain::class)
}
/// 打印類名 JavaMain 是另外的一個類名
fun testPrintClass(clazz: Class<JavaMain>){
println(clazz.simpleName)
}
///再來個 kotlin類的打印
fun testPrintKtClass(clazz: KClass<KotlinMain>){
println(clazz.simpleName)
}
不再贅述、這是兩種調用方式、 上邊的是java類,下邊是kotlin 類的調用方式
接下來說一下 關鍵字衝突怎麼辦
比如說java中in並不是個關鍵字、而在kotlin中卻是關鍵字。
那麼調用方式
// java code
class JavaaMain{
public static final String in = "in";
}
/// kotlin code
fun main(args: Array<String>){
println(JavaMain.`in`)
/// 引用Java類中的變量 使用`` 包括起來 這個衝突。
}
看起來是不是怪怪的 、當然在java中的變量聲明如果避免使用了kotlin關鍵字 也就不用這麼怪異的寫法了
不寫那麼長了、這篇文章。 接下來寫一些kotlin基礎中常見的問題作爲本文的最後一部分。
3. java和kotin 互調常見問題
/// java code
public interface AInterface {
void printHello(int a );
void printHello(Integer a );
}
public class ASample implements AInterface {
public static final ASample as = new ASample();
@Override
public void printHello(int a) {
System.out.print("a: "+ a);
}
@Override
public void printHello(Integer a) {
System.out.print("aI: "+ a);
}
}
那麼我們在kotlin中怎麼調用呢
fun main(args: Array<String>) {
printA()
}
fun printA(){
ASample.`as`.printHello(123)
}
打印結果是:
a:123
這就說明了、如果java中重載方法、方法名、類型一致、 那麼執行只會按照基本類型執行。 也就是按照參數類型爲int 的那個方法執行。
當然在kotlin 中這麼聲明瞭、 你會覺得、我靠、根本就聲明不成功好吧,因爲沒有Integer這個類型。 歇了。
再來一段代碼
在Asample類中我們聲明瞭如下方法
public String isEmpty(String name){
return name.isEmpty()?null:name;
}
在kotlin 中調用
fun printB(){
var fmt1 = ASample().isEmpty("")
/// fmt1 這時候的返回類型是String! 這是無法聲明的一種類型 、是一種kotlin 調用java代碼中的一種兼容類型。
println(fmt1.length)
/// 這裏執行的結果 只能是按照java的語法來走、 打印結果是NullPointerExecption
// var fmt2: String = ASample().isEmpty("")
//
// 這樣調用是不行的、String 是不可空類型 , 而isEmpty 是可空類型。所以編譯不過。
// println(fmt2.length)
var fmt3: String? = ASample().isEmpty("")
/// 當fmt3 聲明成可空類型String? 時、 則調用fmt3? 不會崩潰、打印結果爲null
println(fmt3?.length)
}
上邊的例子說明了,我們要使用一個變量、一個方法、 首先要確定該變量、方法會不會爲空、 如果爲空則需要直接聲明稱爲可空類型, 防止代碼中出現不必要的麻煩。
繼續,
Kotlin 中沒有靜態變量與靜態方法
例如在kotlin中聲明瞭
object Test{
fun sayHello(msg:String){
println(msg)
}
}
那麼在Java中調用sayHello就需要
Test.INSTANCE.sayHello("hello")
kotlin code 則需要
Test.sayHello("k Hello ")
那麼怎樣纔可以使Java中調用時直接使用類名來調用呢
,當然是可以的,
object Test{
@JvmStatic
fun sayHello(msg:String){
println(msg)
}
}
/// java code
Test.sayHello("j hello ")
上面這個@JvmStatic 註解會被編譯成public static的方法 、所以就可以直接調用。
4. 總結
多上手敲、多嘗試、多思考、 有問題評論區我們共同討論進步。