可见性【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] 210. Course Schedule II 课程安排II

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

  2. [LeetCode] 653. Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树

    Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...

  3. JS 各种引擎介绍

    JS 各种引擎介绍 http://www.oschina.net/project/tag/296/javascript-engine 不同浏览器有不同的JS引擎: WebKit , Safari浏览器 ...

  4. Tracking-Learning-Detection (TLD算法总结)

    一.TLD算法简介 TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生ZdenekKalal在2012年7月提出的一种新的单目标长时间跟踪算法.该算法与传 ...

  5. K8S+GitLab+.net core-自动化分布式部署-2

    K8S+GitLab-自动化分布式部署ASP.NET Core(二) ASP.NET Core DevOps K8S+GitLab-自动化分布式部署ASP.NET Core(二) ASP.NET Co ...

  6. RDB和AOF持久化

    RDB和AOF持久化 https://www.cnblogs.com/Tu9oh0st/p/11229317.html Redis提供了不同的持久化选项: RDB持久化以指定的时间间隔保存那个时间点的 ...

  7. LeetCode 566. 重塑矩阵(Reshape the Matrix)

    566. 重塑矩阵 566. Reshape the Matrix 题目描述 LeetCode LeetCode LeetCode566. Reshape the Matrix简单 Java 实现 c ...

  8. C++中的虚函数以及虚函数表

    一.虚函数的定义 被virtual关键字修饰的成员函数,目的是为了实现多态 ps: 关于多态[接口和实现分离,父类指针指向子类的实例,然后通过父类指针调用子类的成员函数,这样可以让父类指针拥有多种形态 ...

  9. AR*更新客户地址联系人

    CREATE OR REPLACE PACKAGE BODY cux_ar_party_location_pkg IS g_pkg_name CONSTANT VARCHAR2() := 'CUX_A ...

  10. hyper-v安装windows7

    win7镜像下载地址 http://msdn.itellyou.cn/ 该网站都是微软系列的正规软件 非常好用 在hyper-v 虚拟机安装windows系统时,到百度搜索了几个iso 都不好用 到h ...