Kotlin扩展深入解析及注意事项和可见性
可见性【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扩展深入解析及注意事项和可见性的更多相关文章
- Kotlin协程解析系列(上):协程调度与挂起
vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...
- Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项
Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...
- OC分类(类目/类别) 和 类扩展 - 全解析
OC分类(类目/类别) 和 类扩展 - 全解析 具体见: oschina -> MyDemo -> 011.FoundationLog-OC分类剖析 http://blog.csdn. ...
- redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐
redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐 1.Redis 官方网站下载: http://redis.io/dow ...
- Kotlin扩展作用域分析与扩展的根本作用解析
在上一次https://www.cnblogs.com/webor2006/p/11219358.html学习了Kotlin的扩展,继续这个话题继续拓展,首先提出这么一个问题:假如我们扩展的方法跟类中 ...
- Kotlin 扩展
Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式. 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响. 扩展函数 扩展函数可以在已有类中添加新的方法 ...
- 为数不多的人知道的 Kotlin 技巧及解析
文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...
- C#的扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
- KSFramework配置表:扩展表格解析类型
解析和扩展表格 配置表示例 配置表模块在编译时,把Excel转化成TSV,并根据Excel的头部信息,生成对应的代码: 比如源码库中的Test.xlsx Excel文件,两个列头,Id和Value,其 ...
随机推荐
- linux中安装robot环境
https://www.cnblogs.com/lgqboke/p/8252488.html(文中验证robotframework命令应该为 robot --version) 可能遇到的问题: 1.p ...
- win7/win10 设置始终以管理员身份运行cmd窗口
在桌面上找到cmd快捷方式图标,右键"属性" 4.选择"快捷方式",点击“高级” 5.勾选用管理员身份运行,点击"确定" 6.点击" ...
- 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案
最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...
- SpringBoot系列教程之Redis集群环境配置
之前介绍的几篇redis的博文都是基于单机的redis基础上进行演示说明的,然而在实际的生产环境中,使用redis集群的可能性应该是大于单机版的redis的,那么集群的redis如何操作呢?它的配置和 ...
- ubuntu18.04LTS服务器用vituralenv安装和配置pytorch和tensorflow
============tensorflow================= $ python3 -m venv tf14====输入例子====# $ vim ~/.bashrc #(添加如下行, ...
- c++模板使用及常见问题
一.为什么使用模板?? 使用模板的目的是为了避免重复声明和定义一系列基本功能相同的函数或者类,其区别因传入参数的不同而产生不同类型的数据,其基本工作过程都是一致的! 二.调用模板函数产生不明确问题 ( ...
- 记一次stm8l程序跑飞
项目使用stm8l051f3做主控,CC2500做数据接收,不发送. 跑飞的现象就是,刚开始能运行,经过一段未知长度的时间,有可能是3分钟,有可能是30分钟,指示灯不再闪烁,中断按键单片机无反应. 接 ...
- docekr安装mysql,redis,git和maven 脚本
编写脚本 images_install.sh #!/bin/bash # author:qiao # 安装脚本 # reids:3.2(自启) mysql:5.7(自启)或者JDK:1.8 tomca ...
- js node md5模块使用问题
问题描述:md5(123456)得到的结果不是正确的. why? 问题查找: 1)安装路径问题: yarn add md5(md5模块在npmjs中显示每周download人数高达百万,有问题还这么多 ...
- AGC028E High Elements 贪心、DP、线段树
传送门 看到要求"字典序最小"的方案,一个很直观的想法是按位贪心,那么我们需要check的就是当某一个数放在了第一个序列之后是否还存在方案. 假设当前两个序列的最大值和前缀最值数量 ...