一天入門Kotlin學習筆記(三)-程序結構(下 )

[toc]html

前言

繼續講下程序結構,這部分相對簡單,有時候可能會比較囉嗦,筆記嘛!就是在學習過程當中我遇到的問題,做爲記錄。你們沒有遇到問題更好。有些是我的理解,有更好的理解歡迎在評論。git

操做符重載(運算符重載)

這部分官網仍是比較好理解的,並且仍是中文操做符重載建議去看下 舉例:github

class Complex(var real: Double, var imaginary: Double) {

    operator fun plus(other: Complex): Complex {
        return Complex(real + other.real, imaginary + other.imaginary)
    }

    operator fun plus(other: Int): Complex {
        return Complex(real + other, imaginary + other)
    }

    operator fun plus(other: Any): Int {
        return real.toInt()
    }

    override fun toString(): String {
        return "$real +${imaginary}i"
    }
}

class Book {
    infix fun on(any: Any): Boolean {
        return false
    }
}

class Desk

fun main(args: Array<String>) {
    val c1 = Complex(2.0, 3.5)
    val c2 = Complex(4.0, 7.5)
    println(c1 + c2)
    println(c1 + 5)
    println(c1 + "HelloWorld")
    if ("a" in args) {// infix 中綴表達式 不可亂用 下降可讀性
    }
    if (Book() on Desk()) {//DSL比較經常使用
    }
}
複製代碼

總結:數組

  • 運算符重載方法必須用operator表示這個是運算符方法
  • 運算符重載只能按照官網已有的方法名進行重載,如+ plus - minus += plusAssign
  • 只對參數個數有要求,對參數類型,返回類型無要求
表達式(中綴表達式,分支表達式,when表達式)
  • 中綴表達式

方法只有一個參數的時候能夠不用對象.方法名這種方式調用:bash

class Book {
    infix fun on(any: Any): Boolean {
        return false
    }
}
class Desk

fun main(args: Array<String>) {
    if (Book() on Desk()) {//DSL比較經常使用
    }
}
複製代碼

中綴表達式經常使用在DSL中,不建議使用,不然下降可讀性ide

  • 分支表達式

if語句:學習

fun main(args: Array<String>) {
    val mode = if (args.isNotEmpty() && args[0] == "1") {
        0
    } else {
        1
    }
}

複製代碼

不交條件語句而叫表達式,是由於Kotlin中時帶返回值ui

  • when表達式

功能相似於Java中的switch,也是帶有返回值的spa

fun main(args: Array<String>) {
    val x = 5
    when (x) {
        !in 1..100 -> println("$x is not in 100")
        in 1..100 -> println("$x is in 100 ")
        args[0].toInt() -> println("x==args[0]")
        is Int -> println("Hello is $x")
        else -> println("default case")
    }

    val mode = when {//有返回值
        args[0].toInt() == 5 -> 1
        else -> 2
    }
}
複製代碼

當條件匹配下面的將不會執行,都沒有匹配的則執行 else ->後面的語句.net

默認參數 變長參數 具名參數
  • 默認參數

這些屬性都很是簡單,直接用例子:

fun hello(char: Char='A'){
    
}
複製代碼

默認參數就是給形參指定一個默認值,當調用時能夠不傳參數。不傳時使用默認值

  • 變長參數

在Java中也有相似的變長參數

Java
 public void vararg1(String... strings) {
}

Kotlin  
public void vararg1(vararg args:String) {
}
複製代碼

變長參數相似於數組。遍歷方式與數組或是集合相同。 可是不用的Java的變長參數只能做爲參數的最後一個Kotlin是沒要求的,如:

Java 
    public void vararg1(String... strings) {
    }//正確
    public void vararg2(String... strings,int i) {
    }//錯誤
複製代碼

在Kotlin中由於有具名參數因此是沒有要求的

  • 具名參數
    具名參數就在傳入參數的同時,寫上參數名稱,如:
fun hello(double: Double, vararg args: Int, string: String) {
    args.forEach(::println)
    println(string)
}
調用:
   hello(3.0, 1, 2, 3, 4, string = "Hello")//在變長參數以前是不須要具名參數的 後面是具名參數 即string= 不指定報錯
複製代碼
  • 數組展開(Spread Operator)
val array = intArrayOf(1, 2, 3, 4)
    val list = ArrayList<Int>()
    list.add(1)
    list.add(2)
    list.add(3)
    hello(*array, string = "hello")
    hello(3.0, *array, string = "hello")
    hello(args = *array, string = "hello")//不傳的話 後面的參數使用具名參數
//    hello(*list,string = "hello")//list 如今還不支持* 表示
複製代碼
- *操做符能夠展開數組,如今還不支持展開集合

- *操做符只用於變長參數列表的實參

- *操做符不能重載    

- *不算通常意義上的運算符  
複製代碼

結語

這篇就結束了,下篇是關於面向對象相關的筆記

Github源碼直接運行,包含所有詳細筆記

相關文章
相關標籤/搜索