【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )(一)

简介: 【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )(一)

I . 扩展函数 作用域 总结


扩展函数作用域总结 :



① 扩展函数作用域 : 扩展函数使用需要导入包 , 如果在本包中使用 , 可以默认不导入包 ;


② 扩展函数可以重载 : 函数名相同 , 函数签名不同的扩展函数可以同时定义 , 导入包时导入一次即可调用所有的重载的扩展函数 ;


③ 扩展函数作用域优先级 : 声明导入的扩展函数优先级高于默认包的优先级 , 声明导入哪个包就调用哪个包的扩展函数 ;




II . 扩展函数 作用域


1 . 扩展函数作用域 : 定义一个扩展函数 , 默认只能在本包中调用 , 如果在别的包调用扩展函数 , 需要导入扩展函数 ;



2 . 扩展函数导入 : 调用接收者类型的扩展函数 , 需要导入扩展函数的包 , 导入格式为 :


import 包名.扩展函数名

1


3 . 调用定义在本包里的扩展函数 : 可以直接调用 , 导入扩展函数的操作可以省略 , 写上也不会出错 ;



4 . 调用定义在其它包的扩展函数 : 必须导入扩展函数 , 才能调用该扩展函数 ;




III . 扩展函数 作用域 简单调用示例


1 . 分别在 本包 和 外包 中定义扩展函数 :



① 本包定义扩展函数 : 普通的扩展函数定义 , 在 extendbean 包的文件下定义 Student 类 , 在 extendbean 包的文件下定义 Student 类的扩展函数 ;


package extendbean
class Student {
    var name : String = "Tom"
    var age : Int = 18
}
//在同一个文件中扩展
fun Student.printName(){
    println("${this.name}")
}



② 外包定义扩展函数 : 外包中定义 Student 类的扩展函数 , 自然需要导入 Student 类 ;


package extenddeclare
import extendbean.Student
//定义扩展函数
fun Student.printNameAndAge(){
    println("${this.name} , ${this.age}")
}



2 . 本包 中调用扩展函数 :



① 代码分析 : 在 extendbean 包中调用 extenddeclare 包中的为 Student 扩展的 printNameAndAge 函数 , 需要使用 import extenddeclare.printNameAndAge 导入该扩展函数 ;
package extendbean
//本包中可以不同导入 Student 包
//import extendbean.Student
//在本包内定义的扩展函数就不需要导入包了
//import extendbean.printAge
//import extendbean.printName
//使用 Student 的扩展 , 也需要导入 扩展函数所在包名.扩展函数名
import extenddeclare.printNameAndAge
fun main() {
    var student : Student = Student()
    student.printNameAndAge()
    student.printName()
}


② 执行结果 :


Tom , 18
Tom


3 . 外包 中调用扩展函数 :



① 代码分析 : 在 extendusage 包中调用 extendbean 包中的 Student 类 和 扩展函数 , 以及 extenddeclare 包中定义的 printNameAndAge 扩展函数 , 需要将 Student 类以及所有的扩展函数都声明导入 , 才可以使用 ;


package extendusage
//使用到 Student 需要导入该类的包
import extendbean.Student
//使用 Student 的扩展 , 也需要导入 扩展函数所在包名.扩展函数名
import extendbean.printName
import extenddeclare.printNameAndAge
fun main() {
    var student : Student = Student()
    student.printNameAndAge()
    student.printName()
}


② 执行结果 :

Tom , 18
Tom



IV . 扩展函数 重载分析


1 . 包内禁止定义相同函数签名的扩展函数 : 在同一个包里 , 定义了一个扩展函数后 , 不允许定义相同函数签名的扩展函数 ; 不管是定义在同一个文件中 , 还是不同的文件中 , 函数签名不可以重复 ;

image.png




2 . 原理分析 : 因为扩展函数是根据 包名.扩展函数名 识别的 , 如果在同一个包内定义了相同函数签名的扩展函数 , 无法识别应该调用哪个扩展函数 ;



3 . 重载说明 : 扩展函数在同一个包内 , 可以进行重载操作 , 即定义函数名相同 , 参数列表和返回值类型或顺序不同的函数 , 两个同名函数签名不同 , 因此可以区分调用 ;


image.png




V . 扩展函数 重载代码示例


1 . 重载扩展函数导入 : 对于重载的扩展函数 , 可以导入一次包即可通过函数签名调用不同的扩展函数 ;



2 . 定义重载扩展函数 : 为 Student 扩展了两个函数 , 分别是 printName() 和 printName(num : Int) , 这两个函数签名不同 , 可以定义 , 调用时根据不同的函数签名分别调用 ;


package extendbean
class Student {
    var name : String = "Tom"
    var age : Int = 18
}
//在同一个文件中扩展
fun Student.printName(){
    println("${this.name}")
}
//测试重载的函数可以只声明一次
fun Student.printName(num : Int){
    println("${this.name}")
}


3 . 调用重载扩展函数 : 根据不同的函数签名调用不同的扩展函数 ;


package extendbean
fun main() {
    var student : Student = Student()
    student.printName()
    student.printName(10)
}


4 . 执行结果 :


Tom
name : Tom , num : 10


目录
相关文章
|
3天前
|
Kotlin
Kotlin - 高阶函数与函数引用
Kotlin - 高阶函数与函数引用
14 3
Kotlin - 高阶函数与函数引用
|
1天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
|
1天前
|
安全 Kotlin
Kotlin教程笔记(23) -作用域函数
Kotlin教程笔记(23) -作用域函数
|
3天前
|
安全 Kotlin
Kotlin - 作用域函数
Kotlin - 作用域函数
11 3
|
6天前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
|
5天前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
17 0
|
Java Kotlin
Kotlin扩展成员(工具类的撰写和定义)
一、扩展成员 为现有的类添加方法、属性 扩展方法:fun X.y(): Z{} 扩展属性:val X.m 注意拓展属性不能初始化,类似于接口属性 二、下面来看一下例子 1.
1253 0
|
26天前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
17 1
|
2月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
73 1
|
3月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
59 4
下一篇
无影云桌面