天天看點

Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

一、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

Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

2)Jetbrains Idea官網 https://www.jetbrains.com/idea/download/

Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

3)指令行工具 http://kotlinlang.org/docs/tutorials/command-line.html

2、Kotlin學習網站

二、Kotlin的基礎

(一)Hello word

所有的新語言都從Hello word 開始,請先記住這種寫法
Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

(二)變量的聲明和使用: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沒有取值範圍
}
           

結果列印:

Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

(四)類型推斷(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 是常量,再次指派,就會報錯
}
           

常量再次指派

編譯報錯

Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

(七)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函數編寫規則

Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

2、Main函數

main

函數說Kotlin程式的入口海曙,是電腦運作起來第一個運作的函數

3、println() 函數

println

函數就是講括号裡面的内容列印到控制台

【例子】列印一個菱形

/**
 * 列印菱形
 *   *
 *  ***
 * *****
 *  ***
 *   *
 */
fun main() {
    print1star()
    print3star()
    print5star()
    print3star()
    print1star()
}

/**
 * 自定義函數
 */
fun print1star() {
    println("  *  ")
}
fun print3star() {
    println(" *** ")
}
fun print5star() {
    println("*****")
}
           

列印結果:

Kotlin基礎(一)(變量、常見容器類型、類型推斷、顯示類型聲明、常量、Boolean、函數、字元串模版、if-else、when、字元串比較)一、Kotlin的介紹二、Kotlin的基礎

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

  • in

    檢測when的條件,在一個區間範圍内
  • !in

    檢測when的條件,不在一個區間範圍内
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

  • is

    檢測when的條件,是一個特定類型的值
  • !in

    檢測when的條件,不是一個特定類型的值
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

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
}
           

繼續閱讀