用Java開發了很多年,因為工作的需要學習Kotlin。初識Kotlin時是各種不習慣,覺得這個語言相對於Java而言並不夠嚴謹。隨着不斷的深入,最終還是逃不過"真香定理"。我一直認為普通的技術使用者是沒有太多的權利去評論一門技術語言的好壞。很多人只了解皮毛就開始對它進行過分的評論。所以大家不要被網上的一些信息所左右(像我這樣單純的程序員好像不多了)。如果你有Java基礎,上手Kotlin是非常的快,而且還會讓你愛不釋手。
Hello World
國際慣例,我們分別用Java和Kotlin實現打印hello world的功能。通過比較兩者的區別,開啟Kotlin大門。
先是熟悉的Java代碼:
第一步:創建java文件,並定義一個HelloWorld類,
第二步:創建類的入口函數main方法,在main函數中執行輸出語句。
package com.java.helloworld;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
接一下是陌生的Kotlin代碼:
第一步:創建kt文件,
第二步:創建入口函數main方法,在main函數中執行輸出語句。
package com.kotlin.helloworld
fun main(args: Array<String>) {
println("Hello World")
}
看到這部分代碼,你一定會奇怪
Kotlin不需要定義class類就可以執行main方法?是的,當然也可以做到先定義類,然后在類中創建main函數。
Kotlin是通過fun關鍵字定義一個函數?
Kotlin的main函數為什么沒有public static void 等關鍵字?
Kotlin的變量名怎么在變量類型的前面?
Kotlin的輸出語句看起來好簡單!!!沒錯,這些都是Kotlin的語法特點。先混個臉熟!
Kotlin簡介
Kotlin 是一種在 Java 虛擬機上運行的靜態類型編程語言。並且Google 已經宣布 Kotlin 成為 Android 官方開發語言。但這並不意味着Kotlin只能做Android開發。Java能做到的,Kotlin基本都可以做到。而且比Java更簡單,更簡潔,更實用。Kotlin還提供了大量的函數幫助我們快速開發,同時也挖了很多坑等着我們跳。
用Kotlin以后發現自己變笨了點!大家有沒有這樣的感覺呢?
Kotlin變量
在Java中,聲明一個變量,必須要先規定變量的類型,然后才是變量的名稱。與之相反,Kotlin是先定義變量名稱,最后才是變量類型。Kotlin甚至可以省略變量類型,通過編譯器智能推斷出變量的類型。這也是變量類型寫在后面的好處。
還是老規矩,我們分別用Java和Kotlin變量定義。通過比較兩者的區別,進一步了解Kotlin。
列舉了一些Java常見的基本數據類型和用法,定義變量的格式:[修飾符] + 變量類型 + 變量名稱
public class Variable {
public static void main(String[] args) {
byte b = 0;
short s = 0;
int i = 0;
long l = 0L;
float f = 0.0f;
double d = 0.0;
boolean bl = true;
char c = 'c';
}
}
習慣用Java的朋友在使用Kotlin中最大的不適應的地方就是變量。因為聲明變量的代碼是常有的,而且兩者的語法格式恰恰相反。Kotlin通過關鍵字val和var定義變量,然后接變量名和變量類型。格式:val/var + 變量名 : 變量類型。
使用關鍵字val修飾變量表示該變量是不可變的,相當於用Java的final修飾。一旦初始化成功后則不能再重新賦值。Kotlin是默認推薦使用val。開發中經常用val引用變量,對象、集合等。
使用關鍵字var修飾變量表示該變量時可變的,常用於修飾基本變量,若在實體類中使用val修飾變量,前端傳遞數據,后端可能會一直獲取不到值。就像GO語言,習慣使用Java和Kotlin語言的朋友,在初寫Go語言代碼時,是否被它的首字母大小寫邏輯給雷到呢?
注意:val的不可變指的是本身,它指向的對象可能是可變的。這里有一個小知識,Kotlin中的集合分只讀和可讀可寫兩種,是不是又不習慣了!
val map: MutableMap<String, String> = mutableMapOf("Key" to "ITDragon")
map["Key"] = "ITDragonBlog"
println(map) // {Key=ITDragonBlog}
var i = 2
i ++
println(i) // 3
小技巧:初寫Kotlin代碼,var和val傻傻分不清楚。記住使用val可能出現值不修改的問題,但是都用var修飾變量,一般只會出現逼死強迫症的編譯警告。
Kotlin變量聲明
Kotlin的變量並非基礎數據類型,而是類似Java的包裝數據類型。不同的是:Java的包裝數據類型的默認值是null。但這里的Kotlin變量都是不允許為null的。因為Kotlin是null 安全的語言。若希望變量值可以為null,則需要在變量類型后面加上?。如Int?,Long?,Float?等等
fun main(args: Array<String>) {
var b: Byte = 0
var s: Short = 0
var i: Int = 0
var l: Long = 0L
var f: Float = 0.0f
var d: Double = 0.0
var bl: Boolean = true
var c: Char = 'c'
}
Kotlin變量取值范圍
相信大家都是有一定Java基礎的朋友,這里只用輸出語句打印變量的取值范圍。${}
是Kotlin字符串拼接的語法,相比Java,更美觀。
fun rangeValue() {
println("Byte (${Byte.MIN_VALUE} ~ ${Byte.MAX_VALUE})")
println("Short (${Short.MIN_VALUE} ~ ${Short.MAX_VALUE})")
println("Int (${Int.MIN_VALUE} ~ ${Int.MAX_VALUE})")
println("Long (${Long.MIN_VALUE} ~ ${Long.MAX_VALUE})")
println("Float (${Float.MIN_VALUE} ~ ${Float.MAX_VALUE})")
println("Double (${Double.MIN_VALUE} ~ ${Double.MAX_VALUE})")
}
Kotlin變量顯示轉換
Java支持將范圍小的變量隱示轉換范圍大的同類型變量,比如int類型轉long類型,char類型轉int類型等。但是Kotlin並不支持。比如Int類型變量和Char類型變量直接相加,編譯器會報錯。Kotlin必須要將Char變量通過執行.toInt()方法顯示轉換成Int類型。
Kotlin的變量還有一個特點,當聲明變量后直接賦值,編譯器會智能推斷該變量的類型,此時變量類型可以省略。
開始覺得不習慣,后來慢慢就習慣了,這可能大概就是佛系程序員的一個特點吧
fun variableConvert(char: Char) {
var number: Int = 1
println("顯示轉換成Int類型: ${number + char.toInt()}")
var num = 2
println("智能推斷變量類型: ${num.javaClass}")
}
到這里,初始Kotlin的內容就介紹了。Kotlin與Java的區別太多太多了。Kotlin的特點也是非常多。我會拆分成多個小章節。Kotlin好學,但是不好講。