美文网首页
9.Kotlin扩展深入解析及注意事项

9.Kotlin扩展深入解析及注意事项

作者: leofight | 来源:发表于2017-12-24 16:16 被阅读0次

1.可见性

可见性 visibility
Kotlin提供4种可见性修饰符: private,protected,internal,public
(1)如果没有指定任何可见性修饰符,则默认使用public,这意味着声明将在任何位置都可见;
(2)如果将一个声明标记为private,那么它只会在包含声明的文件中可见;
(3)如果将其标记为internal,则在同一模块中的任何地方可见;
(4)如果将其标记为protected,则不可用于顶层声明。

  • 示例代码
//顶层声明,不加修饰符默认public
fun method(){

}
class Clazz

对于在类中声明的成员:
(1)private只有在这个类才能看到(包括其所有成员);
(2)protected - 相同于private + 在子类中可见;
(3)internal - 模块中的任何看到声明类的客户端都看到其内部成员;
(4)public - 声明类的任何客户看到它的公共成员。

  • 示例代码
open class Clazz{
    private val b =3;
    protected  open val c = 4;
    internal val d = 5;
}

class subClazz:Clazz(){
    //c、d 可用
}

class Clazz2{
    // d 可用
}
  • 局部变量

局部的变量,函数和类不能有可见性修饰符。

2.扩展

扩展:extension
扩展函数的解析是静态的
(1)扩展本身并不会真正修改目标类,也就是说它并不会在目标类中插入新的属性或是方法
(2)扩展函数的解析式静态分发的,而不是动态的,即不支持多态,调用只取决于对象的声明类型
(3)调用是由对象声明类型所决定的,而不是由对象的实际类型决定。

  • 示例代码

//扩展:extension

class ExtensionTest {
    fun add(a: Int, b: Int) = a + b
    fun subtract(a: Int, b: Int) = a - b
}

fun ExtensionTest.multipy(a: Int, b: Int) = a * b

fun main(args: Array<String>) {
    var extensionTest = ExtensionTest();

    println(extensionTest.add(1, 2))
    println(extensionTest.subtract(1, 2))
    println(extensionTest.multipy(1, 2))

    myPrint(BB())

    CC().foo(1)
}

//扩展函数的解析是静态的
/*
    1.扩展本身并不会真正修改目标类,也就是说它并不会在目标类中插入新的属性或是方法
    2.扩展函数的解析式静态分发的,而不是动态的,即不支持多态,调用只取决于对象的声明类型
    3.调用是由对象声明类型所决定的,而不是由对象的实际类型决定。
 */

open class AA

class BB : AA()

fun AA.a() = "a"
fun BB.a() = "b"

fun myPrint(aa: AA) {
    println(aa.a())
}

//扩展重名
class CC{
    fun foo(){
        println("member")
    }
}

fun CC.foo(i:Int){
    println("member2")
}
//可接受Null的接收器
fun Any?.toString():String{
    if(null == this){
        return "null"
    }

    return toString()
}
  • 运行结果
3
-1
2
a
member2

扩展可以与已有的方法重名,即签名完全一样,这样的情况下,已有方法的优先级别要高。

请注意,可以使用可空(null)接收器类型定义扩展。 这样的扩展可以在一个对象变量上调用,即使它的值为null,并且可以在主体内检查this == null。 这样就可以在Kotlin中调用toString(),而无需检查null:检查发生在扩展函数内。

相关文章

  • 9.Kotlin扩展深入解析及注意事项

    1.可见性 可见性 visibilityKotlin提供4种可见性修饰符: private,protected,i...

  • ThinkPHP vendor 方法导入第三方类库

    ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展 ThinkPHP vend...

  • PHP Xcache缓存加速模块

    Linux系统环境 一、配置Xcache扩展模块生效注意事项:xcache扩展模块和eAccelerator扩展模...

  • Java高级知识

    反射 sczyh30 深入解析Java反射(1) - 基础深入解析Java反射(2) - invoke方法深入探究...

  • Spark内核机制解析及性能调优

    Spark内核机制解析及性能调优致力于Spark内核的深入解析,带领读者掌握Spark内核的各个关键知识点。具体内...

  • 自学中医笔记~4经络值班图

    夜间经络值班图及注意事项 日间经络值班图及注意事项

  • 2019-06-26

    [toc] 网址 深入理解程序构造 LMA与VMA总结 ELF文件解析和加载(附代码) Linux及安全实践四——...

  • PHP eAccelerator模块

    Linux系统环境 一、配置eaccelerator扩展模块生效注意事项:如果使用Zend扩展缓存模块,[eacc...

  • iOS解析XML

    2.0 XML解析 2.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 2.2 XML解析...

  • iOS开发-XML解析

    一、 XML解析 1.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 1.2 XML解析 ...

网友评论

      本文标题:9.Kotlin扩展深入解析及注意事项

      本文链接:https://www.haomeiwen.com/subject/kkncgxtx.html