Kotlin 学习笔记(三)函数的调用 使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27948659/article/details/82224512

前言
本文章只是用于记录学习,所以部分地方如果有错误或者理解不对的地方,麻烦请指正。

Kotlin 学习笔记(二)

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 三种数据结构的创建方法,kotlin 中的 集合部分都是沿用了 java 的 集合类,在java 的基础上包裹了一层,更方便开发者的调用 和 创建。在java 的基础上 还进行了一部分api 的封装。

// 获取数组中最后一个
arr.last()
// 获取数组中最大的一个
arr.max()

为了 方便开发人员,更好的知道函数的用法,我们也可以在 方法头部添加注释,包括方法名称的定义和参数 名称的设置,合理的设置,可以提升代码的阅读力,当然,kotlin也为我们做了一些事情

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

// 普通调用
getColor(Color.GREEN)
// 优化后的调用
getColor(color = Color.GREEN)

如果你是开发人员,在看着 第二种调用方法,会更加简单明了的知道这个参数是干什么的 ,我们应该怎么传,but,如果我们在调用的时候 指明了参数的名称,为了避免混淆,后边的参数也有点要 指明 参数名称。

2.顶层函数 和属性

2.1 顶层函数

该节点我们先使用两段代码,就很好的了解顶层函数说的什么意思了。
main

import util.*

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

Util

package util

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

看完上边两个代码块,我们就大致了解 顶层函数,类似于 我们java 中的 Util类,我们在main 中通过 依赖util .* ,就可以直接在类中使用 util中的方法,并且不用想java 中的 还有前边加上 类名.方法名 来调用。

java的Util 情况。相对于我们写过的项目,不管大小,都会有一个Util文件将爱专门放一些 静态函数,我们一个界面或者 一个Model 里边都会引用很多其他地方的类。
Kotlin 中的 顶层函数:根本不需要创建那么多类,我们可以继续写util 类,但是我们直接把函数放在文件的顶层,这样不用从属与任何的类,并且还是 该类中的一部分,如果在包外,我们就可以通过 import 的方式引入,并且外边也不用包一层。

2.2 顶层属性

和 顶层函数 相似,属性也是可以放在文件的顶层

BUtil

var index = 0
const val indexx = 0

fun todoSomething(){
    index ++
}

main

import util.indexx

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

和顶层函数一样的,不过这里学到了新的关键词 const ,他等同于 java 中的 public static final ,因为不可变,所以 const val 标配。

3.扩展函数和属性

扩展部分 算是kotlin 的一大特色,扩展函数 扩展属性 同理,其实 他就是成员内的函数或者 属性,但是写在了 成员外部。

3.1 扩展函数

// 扩展 函数
fun String.lastData() : Char{
    return this.get(this.length-1)
}


// 获取最后一个单词
import util.lastData

println("Kotlin".lastData())

从上边代码中,我们可以看出 我们想要扩展的类 或者接口名称,添加在函数名称的前面 ,这个 类的名称 称为 接收者类型,所以在本例中 String 就是接收者类型,而 “kotlin” 就是接收者对象,其实我们这样写,就相当于给String 添加了一个方法。但是扩展函数是 不希望你打破 原有类的封装性的,所以扩展函数是无法 访问到 私有的或者受保护的成员

使用的话 记得引用你写的扩展函数地址就可以了 (import util.lastData)
如果你写的函数比较多的话,也可以 import util.*
如果想要动态的换一个名字 (import util.lastData as lastD),这样的话 引用就需要 println(“Kotlin”.lastD())

3.2 从java 中调用扩展函数

如果我们的 扩展函数所在 文件位置在 Func.kt ,如果在java 中调用

Char c = Func.lastData("Kotlin")

扩展函数的静态性质,也决定了不可以被子类重写。

3.3 不可以被重写的 扩展函数

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

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

// 探讨 扩展函数 的不可继承
fun View.shutOff(){
    println("view shut off")
}

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

// 调用语句
val view : View = Button()
view.shutOff()

输出语句

view shut off

扩展函数 并不算是类的一部分,他是声明在类之外的,这里的函数调用 取决于 该变量的静态类型所决定的,而不是编译时 的数据类型所决定的。
所以 扩展函数是不可以 继承的,因为kotlin 是 将他当做静态函数来看待的

如果扩展函数 和 成员函数 签名一样,调用的时候会优先使用 成员函数。

4.扩展属性

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

和扩展函数差不多,不过扩展属性一定要写 getter 方法,因为没有默认字段,所以没有默认的getter方法,同理,初始化也不可以,因为没有存储地址。

猜你喜欢

转载自blog.csdn.net/qq_27948659/article/details/82224512