可见性【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. Office Online Server2016搭建与部署(在线编辑)

    至少需要两台服务器,一台域控制器,一台部署Office Online Server https://docs.microsoft.com/zh-cn/officeonlineserver/office ...

  2. MAVEN安装代码到本地库,安装jar, source, javadoc的方式

    cd /d %~dp0 mvn -Dpackaging=jar mvn -Dpackaging=jar -Dclassifier=sources mvn -Dpackaging=jar -Dclass ...

  3. Apache Kafka Producer For Beginners

    在我们上一篇Kafka教程中,我们讨论了Kafka Cluster.今天,我们将通过示例讨论Kafka Producer.此外,我们将看到KafkaProducer API和Producer API. ...

  4. SpringAOP异常:org.springframework.aop.aspectj.AspectJExpressionPointcut cannot be cast to com.....

    Exception in thread "main" java.lang.ClassCastException: org.springframework.aop.aspectj.A ...

  5. Scratch编程:贪吃鱼(十一)

    “ 上节课的内容全部掌握了吗?反复练习了没有,编程最好的学习方法就是练习.练习.再练习.一定要记得多动手.多动脑筋哦~~” 01 — 游戏介绍 这是一个小游戏,通过键盘的方向键控制着大鲨鱼追着吃掉海星 ...

  6. docker 入坑3

    查看镜像 docker images [OPTIONS] [REPOSITORY[:TAG]] -a, --all=false -f, --filter=[] --no-trunc=false -q, ...

  7. NIO开发Http服务器(1):项目下载、打包和部署

    最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...

  8. 5_PHP数组_3_数组处理函数及其应用_3_数组指针函数

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组指针函数 1. key() 函数 程序: <?php $interests[2] = "mus ...

  9. semaphore demo 并行 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    import 'dart:async'; import 'package:semaphore/semaphore.dart'; import 'dart:io'; import 'dart:conve ...

  10. 【转载】C#中string类使用Remove方法来移除指定位置的字符

    在C#的字符串操作过程中,有时候需要将字符串中指定位置的字符移除,此时就可能使用到字符串类string类中的Remove方法,此方法允许指定移除开始的开始的索引位置,以及移除的长度信息等,共有2个重载 ...