可见性【Visibility】:

在Java中的可见性有public、protected、private、default四种,而在Kotlin中也有四种:public、protected、private、internal,下面来细说一下:

作用在顶层类及函数上:

像这样直接定义在包下面的则称之为顶层类及函数,如下:

①、我们知道在Java中如果啥都不写就是包级别的default可见性,但是在Kotlin中不是这样的,默认是public的,当然是哪都能使用喽。

②、如果我们将其声明为private,则只能在当前的.kt这个文件中来使用,如下:

③、如果声明为internal,则只能在一个module中可见,其中module的概念就是说当前工程,比如像gradle构造的整个工程既为一个module,如下:

④、关于protected修饰符,它有一个特殊的地方,就是不能用在顶层[top level]的函数及类上,啥叫顶层函数及类,像我们目前定义的就属于这种,如下:

那咱们来试试,看能否在这俩上加protected修饰符:

确实是!!

作用在类里面的函数及属性上:
比如:

总的修饰符的情况如下:

①、如果类里面声明了private,则只能在当前类中进行使用,跟Java一样。

②、如果类里面声明了protected,可以在当前类及子类使用,跟Java也一样。

③、如果类里面声明了internal,如果能使用类,则就可以使用。

④、如果类里面声明了public,任何地方都可用。

下面举个例子再来巩固一下:

其中第一个属性b是私有的,它只能在Clazz当前类使用,不能在子类使用,如下:

而对于c只能在子类subClazz中使用,d也能在subClazz中使用,因为和Clazz是在一个模块的。那如果定义一个不继承的类:

那么对于在Clazz中定义的三个属性,其可见性如下:

关于可性修饰符就学到这,比较简单。

扩展【extension】:

关于扩展这个特性是在Java中没有的,但是其实是在其它有些语言早就已经存在的概念的,如c#,那啥叫扩展呢?在Java中当我们定义好了一个类,如果想要给该类扩充功能有哪些手段呢?继承是很容易想到的一个方式,另外可以利用装饰模式来进行扩充如IO相关的东东。而在Kotlin中可以很轻松的对类进行动态的扩展,下面来感受一下:

很easy,接下来想要完成数字的乘法,很明显是目前我们定的类中不满足的功能,而且这个类不是我们自己写的放到jar包里面,也就是只读,接下来Kotlin的扩展功能就发挥作用了,如下:

是不是很神奇~~其实在Android中的Kotlin开发中会发现这个特性大量被用到的,以上就是关于Kotlin的扩展的使用,比较简单,但是仅仅只是学会用很明显是不够的,接一来看一下它的底层的一些东东。

1、扩展函数的解析是静态的,扩展本身并不会真正修改目标类,也就是说它并不会在目标类中插入新的属性或是方法。

从我们的程序可以看出,是给类动态扩展了一个方法,但是!!!并非我们所理解的那样,是将我们扩展的方法插入到了类中,其实不是这样的,原类拥有的方法还是只有2个,如下:

我不信,不可能~~那下面将其字体码反编译看一下就知道了:

2、 扩展函数的解析是静态分发的,而不是动态的,既不支持多态,调用只取决于对象的声明类型。调用是由对象声明类型所决定的,而不是由对象的实际类型决定。

关于多态,既是用一个父类型的引用来指向子类型的对象,比如回顾一下Java代码:

其中它里面具体是调用哪个a(),是由传给parent参数的实际类型来决定的,如果传过来的是Parent,那么调用的就是Parent.a(),而如果传过来的是Child,那么调用的就是Child.a(),这是一个动态调用,但是!!!!在Kotlin扩展函数的解析是不支持多态的,它只看声明的类型,而不看实际的类型,下面举个具体例子来看一下:

Kotlin扩展深入解析及注意事项和可见性的更多相关文章

  1. Kotlin协程解析系列(上):协程调度与挂起

    vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...

  2. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  3. OC分类(类目/类别) 和 类扩展 - 全解析

    OC分类(类目/类别) 和 类扩展 - 全解析   具体见: oschina -> MyDemo -> 011.FoundationLog-OC分类剖析 http://blog.csdn. ...

  4. redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐

    redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐 1.Redis 官方网站下载: http://redis.io/dow ...

  5. Kotlin扩展作用域分析与扩展的根本作用解析

    在上一次https://www.cnblogs.com/webor2006/p/11219358.html学习了Kotlin的扩展,继续这个话题继续拓展,首先提出这么一个问题:假如我们扩展的方法跟类中 ...

  6. Kotlin 扩展

    Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式. 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响. 扩展函数 扩展函数可以在已有类中添加新的方法 ...

  7. 为数不多的人知道的 Kotlin 技巧及解析

    文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...

  8. C#的扩展方法解析

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...

  9. KSFramework配置表:扩展表格解析类型

    解析和扩展表格 配置表示例 配置表模块在编译时,把Excel转化成TSV,并根据Excel的头部信息,生成对应的代码: 比如源码库中的Test.xlsx Excel文件,两个列头,Id和Value,其 ...

随机推荐

  1. [LeetCode] 207. Course Schedule 课程安排

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  2. [LeetCode] 295. Find Median from Data Stream 找出数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  3. kexue shangwang

    根据实践,pptp.IPsec甚至OpenVPN等kexue上网法已经无法顺利翻越GFW.通过抓包可知,GFW会将pptp的握手期间的ack包吞掉,导致本地一直无法收到服务器端的响应.而OpenVPN ...

  4. [ARM-Linux开发]linux 里 /etc/passwd 、/etc/shadow和/etc/group 文件内容解释

    linux 里 /etc/passwd ./etc/shadow和/etc/group 文件内容解释 一./etc/passwd 是用户数据库,其中的域给出了用户名.加密口令和用户的其他信息 /etc ...

  5. com.alibaba.fastjson使用介绍

    首先,介绍一下fastjson.fastjson是由alibaba开源的一套json处理器.与其他json处理器(如Gson,Jackson等)和其他的Java对象序列化反序列化方式相比,有比较明显的 ...

  6. javascript遍历对象的属性

    不同类型的循环 JavaScript 支持不同类型的循环: for - 多次遍历代码块 for/in - 遍历对象属性 while - 当指定条件为 true 时循环一段代码块 do/while - ...

  7. python is 和 == 区别(8)

    在python中is和==都说常用的运算符之一,主要用于检测两个变量是否相等,返回True或者False,具体区别在哪呢? 一.前言 在讲解is和==区别直接先讲解一下内置函数id(),其实在文章 p ...

  8. mysql 逻辑运算符

    NOT! 逻辑非. 如果操作数为 0,返回 1:如果操作数为非零,返回 0:如果操作数为 NOT NULL,返回 NULL. mysql> SELECT NOT 10; -> 0 mysq ...

  9. QML CheckBox的使用

    "人类的全部历史都告诫有智慧的人,不要笃信时运,而应坚信思想. -- 爱献生" 这个在QT creator 帮助文档中非常容易查到. Import Statement: impor ...

  10. [转载]机器学习&深度学习经典资料汇总,全到让人震惊

    自学成才秘籍!机器学习&深度学习经典资料汇总 转自:中国大数据: http://www.thebigdata.cn/JiShuBoKe/13299.html [日期:2015-01-27] 来 ...