一、Kotlin的介紹
(一)Kotlin的優勢
- 1、全面支援Lambda表達式 ⭐️
- 2、資料類(Data classes)⭐️
- 3、函數字面量和内聯函數(Function literals & inline functions)⭐️
- 4、函數擴充(Extension functions)⭐️
- 5、空安全(Null safety)⭐️
- 6、智能轉換(Smart casts)⭐️
- 7、字元串模版(String templates)
- 8、主構造函數(Primary constructors)
- 9、類委托(Class delegation)⭐️
- 10、類型推斷(Type inference)
- 11、單例(Singletons)
- 12、聲明點變量(Declaration-site variance)
- 13、區間表達式(Range expressions)
(二)Kotlin相關官網
1、下載下傳網站
1)Kotlin的官網 https://kotlinlang.org/
以下是開發Kotlin的工具,推薦使用IDEA
2)Jetbrains Idea官網 https://www.jetbrains.com/idea/download/
3)指令行工具 http://kotlinlang.org/docs/tutorials/command-line.html
2、Kotlin學習網站
二、Kotlin的基礎
(一)Hello word
所有的新語言都從Hello word 開始,請先記住這種寫法
(二)變量的聲明和使用:var
程式中的資料都必須通過變量來處裡,處裡不同的資料,必須使用不同的變量類型
fun main(args: Array<String>) {
// 1、計算機配置設定了一個空間name,裡面存放的是字元串類型的資料,值為“張三”
var name = "張三"
// 2、将name空間重新指派,值為“李四”
name = "李四"
// 3、name已經是String類型,無法轉換為Int類型,是以這樣寫會報錯
name = 8
}
1、在kotlin中通過關鍵字
var
來定義變量
2、var name = “李四”,然後name = 8
編譯報錯
,因為name變量已經定義為
String
類型,就無法自動轉換為
Int
類型
(三)常見容器類型
不同的資料類型用不同的容器類型儲存
Kotlin和Java不同,所有的資料類型都是類對象,而不是關鍵字
資料類型 | 取值範圍 | 存儲機關 |
---|---|---|
Byte | 整數-128~127 | 8塊存儲機關 8bit |
Short | 整數-32768~32767 | 16塊存儲機關 16bit |
Int | 整數-2147483648~2147483647 | 32塊存儲機關 32bit |
Long | 整數-9223372036854775808~9223372036854775807 | 64塊存儲機關 64bit |
Float | 小數,小數點可以精确到6位 | 符号位:1bit,指數位:11bit,尾數位:23bit |
Double | 小數,小數點可以精确到15~16位 | 符号位:1bit,指數位:11bit,尾數位:52bit |
String | 字元串,用""雙引号引起來的字元串都可以存儲 |
fun main(args: Array<String>) {
var maxByte: Byte = Byte.MAX_VALUE
var minByte: Byte = Byte.MIN_VALUE
println("Byte的最大值:" + maxByte)
println("Byte的最小值:" + minByte)
var maxInt: Int = Int.MAX_VALUE
var minInt: Int = Int.MIN_VALUE
println("Int的最大值:" + maxInt)
println("Int的最小值:" + minInt)
var maxLong: Long = Long.MAX_VALUE
var minLong: Long = Long.MIN_VALUE
println("Long的最大值:" + maxLong)
println("Long的最小值:" + minLong)
// var maxString: String = String.MAX_VALUE String沒有取值範圍
}
結果列印:
(四)類型推斷(Type inference)
Kotlin會通過類型判斷自動推斷資料類型
案例【1】
自動類型推斷為
Int
, 再次指派
Long
範圍的值,
編譯報錯
fun main(args: Array<String>) {
var i = 18 // 計算機開辟一塊整數的存儲空間,名字為i
i = 19
i = 9999999999 // i的類型推斷為Int, 範圍在-2147483648 ~ 2147483647
}
案例【2】
s的類型推斷為
String
,不可以指派整數123
fun main(args: Array<String>) {
var s = "haha" // 計算機開辟一塊字元串的存儲空間,名字為s
s = 123 // s的類型推斷為String,不可以指派整數123
}
(五)顯示類型聲明
可以通過顯示的方式來指定資料類型
1、顯示定義為Int
2、顯示定義為Long
3、顯示定義為String
4、顯示定義為Short
變量d已經定義為
Short
類型,
Short
類型的取值範圍在-128~127,再次指派255已經超出了
Byte
類型的範圍,
編譯報錯
var d:Byte = 18
d = 255 // 255超出了Byte類型的範圍
5、【注意】定義變量時,如果不指派,必須制定顯示類型聲明,否則自動類型判斷,kotlin無法知道類型
var e // 自動類型判斷必須是 = 後面确定了具體的類型,否則會報錯,Kotlin不知道類型
var e:String // 指定了顯示類型聲明,Kotlin知道類型,就不會報錯
(六)常量:val
- 變量是一個容器,裡面存放的是可讀可寫的資料
- 常量是一個容器,裡面存放的是隻讀的資料
fun main(args: Array<String>) {
/**
* 變量
*/
var number1 = "NO.123"
number1 = "NO.234"
/**
* 常量
*/
val number2 = "NO.123"
number2 = "NO.234" // number2 是常量,再次指派,就會報錯
}
常量再次指派
編譯報錯
(七)Boolean布爾類型
Boolean布爾類型:
- true 真
- false 假
【例1】比較兩個數的大小
fun main(args: Array<String>) {
var num1 = 4
var num2 = 6
println(num1 > num2) // 列印結果:false
}
【例2】比較 5 − 4 \sqrt5-\sqrt4 5
−4
和 4 − 3 \sqrt4-\sqrt3 4
−3
大小
fun main(args: Array<String>) {
var num3 = Math.sqrt(5.0) - Math.sqrt(4.0) // 使用Java lang 包下的數學類Math
var num4 = Math.sqrt(4.0) - Math.sqrt(3.0)
println(num3 > num4) // 列印結果:false
}
【例3】比較 2100 和 375 的大小
fun main(args: Array<String>) {
var num5 = Math.pow(2.0, 100.0) // 使用Java lang 包下的數學類Math
var num6 = Math.pow(3.0, 75.0)
println(num5 < num6) // 列印結果:true
}
(八)函數
函數是計算機執行指令的單元
計算機裡面的函數就是程式執行的小片段,這些小片段可以有機的組合在一起,完成一個複雜的業務能力
我們編寫的函數一般都是用來處理資料,解析資料,将參數交給函數,函數處理完畢,産生輸出
1、Kotlin函數編寫規則
2、Main函數
main
函數說Kotlin程式的入口海曙,是電腦運作起來第一個運作的函數
3、println() 函數
println
函數就是講括号裡面的内容列印到控制台
【例子】列印一個菱形
/**
* 列印菱形
* *
* ***
* *****
* ***
* *
*/
fun main() {
print1star()
print3star()
print5star()
print3star()
print1star()
}
/**
* 自定義函數
*/
fun print1star() {
println(" * ")
}
fun print3star() {
println(" *** ")
}
fun print5star() {
println("*****")
}
列印結果:
3、自定義函數
【例1】編寫一個小型電腦
fun main(args: Array<String>) {
var a = 8
var b = 2
println(add(a, b))
println(sub(a, b))
println(mutl(a, b))
println(devide(a, b))
}
/**
* 加法
* fun:固定寫法
* add:函數名字
* a: 第一個參數,類型Int
* b: 第二個參數,類型Int
* : Int 表示傳回值為Int類型
*/
fun add(a: Int, b: Int): Int {
return a + b
}
fun sub(a: Int, b: Int): Int {
return a - b
}
fun mutl(a: Int, b: Int): Int {
return a * b
}
fun devide(a: Int, b: Int): Int {
return a / b
}
【例2】編寫函數練習
/**
* 請編寫函數,函數名為sayHello,方法傳回值是String類型,一個參數是String類型,名稱為name
*/
fun sayHello(name: String): String {
return "我叫" + name
}
/**
* 輕便鞋函數,函數名為checkAge,方法的傳回值是Boolean類型,一個參數是整數類型,名稱為age
*/
fun checkAge(age: Int): Boolean {
return if(age == 18) true else false
}
/**
* 請編寫函數,函數名為saveLog,方法沒有傳回值,一個參數是整數類型,名稱為logLevel
* 沒有傳回值是:Unit,Unit可以省略不寫
*/
fun saveLog(logLevel: Int):Unit {
println("儲存成功" + logLevel)
}
(九)字元串模版
問:who are you ? How old are you ?
- Java:“I’m” + name + “. I’m " + age + " years old.”
- Kotlin:“I’m${name}. I’m ${age} years old.”
1、Kotlin中采用了
${}
來實作字元串填充,去掉了Java中繁瑣的字元串拼接。
2、當字元串中需要填充的隻有一個變量時,并且右邊有标點符号或者空格,可以省略
{}
,比如
$placeName
3、
${}
可以寫任意的表達式,比如
${placeName.length}
4、如果需要在原生字元串中表示字面值 $ 字元(它不支援反斜杠轉義),比如
${'$'}
【例子】日記生成器
fun main(args: Array<String>) {
println(diaryGenerater("金銮殿", 100.0f))
}
fun diaryGenerater(placeName: String, price: Float): String {
return "今天爸爸、媽媽帶着我去參觀了$placeName, 這${placeName.length}個字的地方,花了${'$'}${price}錢"
}
(十)條件控制 if-else
問:求兩個數的最大值
- Java:return a > b ? a : b
- Kotlin:return if (a > b) a else b
1、Kotlin中沒有三元表達式,因為
if-else
有傳回值,可以直接替代三元表達式
2、
if-else
的傳回值在條件控制中的最後一行
3、
if-else
的傳回值不是必須的,可以有,也可以沒有
4、
if-else
因為有傳回值,可以直接複制給變量
【方法一】求兩個數的最大值:普通的
if-else
寫法
fun max(num1: Int, num2: Int): Int {
if (num1 > num2) return num1 else return num2
}
【方法二】求兩個數的最大值:直接傳回
if-else
的傳回值的寫法
fun max(num1: Int, num2: Int): Int {
return if (num1 > num2) num1 else num2
}
【方法三】求兩個數的最大值:将
if-else
指派給變量的寫法
fun max(num1: Int, num2: Int): Int {
var max = if (num1 > num2) num1 else num2
return max
}
(十一)when表達式
- Java:switch
- Kotlin:when (更加強大的switch) ,将它的參數和所有的分支條件順序比較,直到某個分支滿足條件
1、when條件:具體資料 – 常量
when (num) {
1 -> println("目前資料 = 1")
2, 3, 4-> println("目前資料 = 2,3,4")
else -> println("其他資料 = $num")
}
2、when條件:具體資料 – 任意表達式
when (num) {
parseInt(x) -> println("目前資料 = 1")
else -> println("其他資料 = $num")
}
3、when條件:區間範圍:in、!in
-
檢測when的條件,在一個區間範圍内in
-
檢測when的條件,不在一個區間範圍内!in
var validNumbers = 11..20
when (num) {
in 1..10 -> println("目前資料在1~10的範圍内")
in validNumbers -> println("目前資料在11~20的範圍内")
!in 21..30 -> println("目前資料在21~30的範圍内")
else -> println("其他資料 = $num")
}
3、when條件:特定類型的值:is、!is
-
檢測when的條件,是一個特定類型的值is
-
檢測when的條件,不是一個特定類型的值!in
when (num) {
is String -> println("目前資料是String類型")
is Int -> println("目前資料是Int類型")
!is Boolean -> println("目前資料不是Boolean類型")
else -> println("其他資料類型")
}
4、when條件:枚舉類
enum class Week {
星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期天
}
fun judgeNum(num: Week) {
var result = when (num) {
Week.星期一,Week.星期二,Week.星期三 -> println("目前屬于星期一到星期三")
else -> println("其他星期")
}
}
5、when不提供參數可以取代if-else-if
1、
when
可以用來取代
if-else-if
鍊
2、不提供參數時,所有的分支條件都是布爾表達式
when {
a > b -> println("a > b")
a < b -> println("a < b")
else -> println("a = b")
}
6、when有傳回值
1、
when
有傳回值,可以指派給變量
2、
when
有傳回值,可以直接傳回值
var result = when (num) {
is String -> true
else -> false
}
(十二)字元串比較
問:比較兩個字元串str1 = “danke”,str2 = "danke"是否相等
- Java:str1 == str2 // false, 因為Java比較的是兩個字元串的位址是否相等
- Kotlin:str1 == str2 // true, 因為Kotlin比較的是兩個字元串的值是否相等
1、 ==
比較值相等,相當于 equals
==
equals
fun main(args: Array<String>) {
var str1 = String("danke".toByteArray())
var str2 = String("danke".toByteArray())
println(str1 == str2) // 列印結果:true
println(str1.equals(str2)) // 列印結果:true
}
2、比較大小是否忽略大小寫
equals(String, boolean)
第二個參數true:忽略,false:不忽略
fun main(args: Array<String>) {
var str3 = "danke"
var str4 = "Danke"
println(str3.equals(str4, true)) // 列印結果:true
println(str3.equals(str4, false)) // 列印結果:false
}
3、 ===
比較對象的位址相等
===
(1)需要将常量字元串裝換為String對象,才能驗證
===
比較的是引用
fun main(args: Array<String>) {
var str1 = String("danke".toByteArray())
var str2 = String("danke".toByteArray())
println(str1 === str2) // 列印結果:false
}
(2)和Java一樣,Kotlin也有常量池,常量池中的資料,比較都是相等的(具體可以翻閱我的Java基礎篇
==
和
equals
的差別)
fun main(args: Array<String>) {
var str1 = "danke"
var str2 = "danke"
println(str1 === str2) // 列印結果:true
}