午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Kotlin 學(xué)習(xí)筆記(三)函數(shù)的調(diào)用 使用

 妍鈺館 2018-11-30

1. 集合

    // set
    val set = hashSetOf(1,2,3)
    // list
    val arr = arrayListOf(2,3,4,5)
    // hashmap
    val map = hashMapOf(1 to "A",2 to "B")

?? 上述代碼 展示的是一半的 set , arraylist , hashmap 三種數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建方法,kotlin 中的 集合部分都是沿用了 java 的 集合類,在java 的基礎(chǔ)上包裹了一層,更方便開發(fā)者的調(diào)用 和 創(chuàng)建。在java 的基礎(chǔ)上 還進行了一部分api 的封裝。

// 獲取數(shù)組中最后一個
arr.last()
// 獲取數(shù)組中最大的一個
arr.max()

?? 為了 方便開發(fā)人員,更好的知道函數(shù)的用法,我們也可以在 方法頭部添加注釋,包括方法名稱的定義和參數(shù) 名稱的設(shè)置,合理的設(shè)置,可以提升代碼的閱讀力,當然,kotlin也為我們做了一些事情

fun getColor(color :Color){
    when(color){
        Color.BLUE ,Color.RED -> println("this is blue or red")
        Color.GREEN -> println("this is GREEN")
    }
}

// 普通調(diào)用
getColor(Color.GREEN)
// 優(yōu)化后的調(diào)用
getColor(color = Color.GREEN)

?? 如果你是開發(fā)人員,在看著 第二種調(diào)用方法,會更加簡單明了的知道這個參數(shù)是干什么的 ,我們應(yīng)該怎么傳,but,如果我們在調(diào)用的時候 指明了參數(shù)的名稱,為了避免混淆,后邊的參數(shù)也有點要 指明 參數(shù)名稱。

2.頂層函數(shù) 和屬性

?2.1 頂層函數(shù)

?? 該節(jié)點我們先使用兩段代碼,就很好的了解頂層函數(shù)說的什么意思了。
main

import util.*

fun main(args: Array<String>) {
    HelloWorld()
}

Util

package util

fun HelloWorld(){
    println("hello")
}

?? 看完上邊兩個代碼塊,我們就大致了解 頂層函數(shù),類似于 我們java 中的 Util類,我們在main 中通過 依賴util .* ,就可以直接在類中使用 util中的方法,并且不用想java 中的 還有前邊加上 類名.方法名 來調(diào)用。

java的Util 情況。相對于我們寫過的項目,不管大小,都會有一個Util文件將愛專門放一些 靜態(tài)函數(shù),我們一個界面或者 一個Model 里邊都會引用很多其他地方的類。
Kotlin 中的 頂層函數(shù):根本不需要創(chuàng)建那么多類,我們可以繼續(xù)寫util 類,但是我們直接把函數(shù)放在文件的頂層,這樣不用從屬與任何的類,并且還是 該類中的一部分,如果在包外,我們就可以通過 import 的方式引入,并且外邊也不用包一層。

?2.2 頂層屬性

?? 和 頂層函數(shù) 相似,屬性也是可以放在文件的頂層

BUtil

var index = 0
const val indexx = 0

fun todoSomething(){
    index ++
}

main

import util.indexx

fun main(args: Array<String>) {
    println(indexx)
}

?? 和頂層函數(shù)一樣的,不過這里學(xué)到了新的關(guān)鍵詞 const ,他等同于 java 中的 public static final ,因為不可變,所以 const val 標配。

3.擴展函數(shù)和屬性

擴展部分 算是kotlin 的一大特色,擴展函數(shù) 擴展屬性 同理,其實 他就是成員內(nèi)的函數(shù)或者 屬性,但是寫在了 成員外部。

?3.1 擴展函數(shù)

// 擴展 函數(shù)
fun String.lastData() : Char{
    return this.get(this.length-1)
}


// 獲取最后一個單詞
import util.lastData

println("Kotlin".lastData())

?? 從上邊代碼中,我們可以看出 我們想要擴展的類 或者接口名稱,添加在函數(shù)名稱的前面 ,這個 類的名稱 稱為 接收者類型,所以在本例中 String 就是接收者類型,而 “kotlin” 就是接收者對象,其實我們這樣寫,就相當于給String 添加了一個方法。但是擴展函數(shù)是 不希望你打破 原有類的封裝性的,所以擴展函數(shù)是無法 訪問到 私有的或者受保護的成員。

注意: 一個類定義有一個成員函數(shù)與一個擴展函數(shù),而這兩個函數(shù)又有相同的接收者類型、相同的名字并且參數(shù)都沒有 或者參數(shù)類型都一樣,這種情況總是取成員函數(shù)。(成員函數(shù)優(yōu)先級高

class C {
    fun foo() { println("member") }
}

fun C.foo() { println("extension") }
// 如果這里調(diào)用 foo 方法 就會打印 member。

// 如果這里 調(diào)用 C().foo(1) ,就會打印 extension。(前提是參數(shù)不一樣)
fun C.foo(i: Int) { println("extension") }

使用的話 記得引用你寫的擴展函數(shù)地址就可以了 (import util.lastData)
如果你寫的函數(shù)比較多的話,也可以 import util.*
如果想要動態(tài)的換一個名字 (import util.lastData as lastD),這樣的話 引用就需要 println(“Kotlin”.lastD())

?3.2 從java 中調(diào)用擴展函數(shù)

?? 如果我們的 擴展函數(shù)所在 文件位置在 Func.kt ,如果在java 中調(diào)用

Char c = Func.lastData("Kotlin")
  • 1

擴展函數(shù)的靜態(tài)性質(zhì),也決定了不可以被子類重寫。

? 3.3 不可以被重寫的 擴展函數(shù)

open class View{
    open fun click(){
        print("view")
    }
}

class Button : util.View() {
    override fun click() {
        print("Button")
    }
}

// 探討 擴展函數(shù) 的不可繼承
fun View.shutOff(){
    println("view shut off")
}

fun Button.shutOff(){
    println("Button shut off")
}

// 調(diào)用語句
val view : View = Button()
view.shutOff()

輸出語句

view shut off

?? 擴展函數(shù) 并不算是類的一部分,他是聲明在類之外的,這里的函數(shù)調(diào)用 取決于 該變量的靜態(tài)類型所決定的,而不是編譯時 的數(shù)據(jù)類型所決定的。
所以 擴展函數(shù)是不可以 繼承的,因為kotlin 是 將他當做靜態(tài)函數(shù)來看待的

如果擴展函數(shù) 和 成員函數(shù) 簽名一樣,調(diào)用的時候會優(yōu)先使用 成員函數(shù)。

4.擴展屬性

例子 1

var StringBuffer.lastDataString : Char
    get() {
       return this.get(this.length -1 )
    }
    set(value) {
        this.setCharAt(this.length-1 ,value)
    }

?? 和擴展函數(shù)差不多,不過擴展屬性一定要寫 getter 方法,因為沒有默認字段,所以沒有默認的getter方法,同理,初始化也不可以,因為沒有存儲地址。

例子2

inner class CButton {
        var b: Int = a
        val MeButton.dd: Int
            get() = 1
    }

如果 不添加get 方法,編譯器 也會給我們報錯 “extension property cannot be initialized because it has no backing field” 。

5. 可空接收者

fun Any?.toString(): String? {
    if (this == null) return "null"
    // 空檢測之后,“this”會自動轉(zhuǎn)換為非空類型,所以下面的 toString()
    // 解析為 Any 類的成員函數(shù)
    return toString()
}

??上段代碼,我們看到 在函數(shù)方法名 后邊和 返回值后邊都有 “?” ,kotlin 中問號表示可以為空,所以我們代碼中要對 null 進行判斷。

6. 擴展聲明為成員

??在一個類內(nèi)部你可以為另一個類聲明擴展。在這樣的擴展內(nèi)部,有多個 隱式接收者 —— 其中的對象成員可以無需通過限定符訪問。擴展聲明所在的類的實例稱為 分發(fā)接收者,擴展方法調(diào)用所在的接收者類型的實例稱為 擴展接收者.(雖然我也不懂字面意思 但是看完代碼就懂了)

class D {
    fun bar() { …… }
}

class C {
    fun baz() { …… }

    fun D.foo() {
        bar()   // 調(diào)用 D.bar
        baz()   // 調(diào)用 C.baz
    }

    fun caller(d: D) {
        d.foo()   // 調(diào)用擴展函數(shù)
    }
}

class C {
    fun D.foo() {
        toString()         // 調(diào)用 D.toString()
        this@C.toString()  // 調(diào)用 C.toString()
    }
}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多