Kotlin——中级篇(三):可见性修饰符详解
在Kotlin
中,不管是类,对象,接口,构造函数,函数,属性及其设置器
都具有可见性修饰符。Kotlin
中的可见性修饰符共四种。即public、protected、private、internal
。在不同的场景声明不同的修饰符都有不同的可见性。下面详解介绍不同的修饰符在不同场景的范围。
这里值得注意的是,属性的Getter()
函数的可见性具有与属性相同的可见性。
目录
一、 四种修饰符的说明
public
修饰符表示 公有 。此修饰符的范围最大。当不声明任何修饰符时,系统会默认使用此修饰符。internal
修饰符表示 模块 。对于模块
的范围在下面会说明。protected
修饰符表示 私有+
子类。值得注意的是,此修饰符不能用于顶层
声明,在下面可以看到。private
修饰符表示 私有 。此修饰符的范围最小,即可见性范围最低。
二、在不同场景下各个修饰符声明的范围讲解
对于可见性修饰符来说,不管是
Java
还是Kotlin
,在不同的场景下用可见性修饰符修饰过的变量、函数、属性等都有不同的引用范围。
2.1、在包(package
)中声明,即顶层声明的情况
在顶层申明中分为下面两种情况:
- 在同一个文件中访问的情况
- 在不同文件中访问的情况
2.1.1、测试同一个文件中声明不同的修饰符的范围
2.1.2、测试不同文件中声明不同的修饰符的范围
2.1.3、小结
- 在顶层情况下声明的变量、方法、类、接口等,不能使用
protected
修饰符。public
修饰符可省略,因为它是系统默认的。- 在同一文件下,用任意修饰符都可以访问,当然此处除开
protected
修饰符- 在不同文件下,只能访问
public
、internal
修饰符修饰的变量、方法等- 上边只演示了在顶层声明方法的情况,不过声明其他的也是一样的。
2.2、在类(class
)和接口(interface
)中声明的情况
- 在类中声明的情况和在接口中声明的情况是完全不相同的。
2.2.1、测试在类中声明的情况
2.2.2、测试在接口中声明的情况
在接口中声明的情况
使用接口中声明的属性
2.2.3、小结
- 在类中声明属性、方法等,可以使用任意修饰符修饰。并且在类中的任意位置都能访问各个修饰符修饰的属性、方法等。
- 在类外,只能访问由
public
、internal
修饰符修饰的属性、方法。此情况不管是不是在同一个文件中去操作。- 在接口中声明的情况下,只能由
public
修饰符修饰属性。方法可由public
、private
两个修饰符去修饰,但是,用private
修饰符修饰符修饰的方法不能被实现该接口的类重写。- 为了使用接口中由
public
修饰符修饰的属性、方法等。只能定义一个类去实现该接口,然后重写其属性、方法。这样就能在可在类中或类外去操作。
2.3、在构造函数中声明的情况
看过我前几遍文章的都知道在
Kotlin
中分为主构造函数,和副级或多级构造函数,当然在Java
中也是存在的,只不过我们更习惯称其为方法重载
。对此还不甚清晰的,可以阅读我的上一篇文章Kotlin——中级篇(一):类(class)详解。
故而,当我们在构造函数中声明的情况下,如果是主构造函数的时候,是和在类(class
)中声明的情况是一样的。如果是主构造函数的时候,则是和在局部声明的情况是一样的。
2.4、局部声明的情况
在局部声明的情况下,只能使用
public
修饰符修饰的变量。并且在变量只能在局部这个范围内使用,出了这个范围后就访问不到了。
三、与Java
中的可见性修饰符的对比
Java
中的可见性修饰符和Koltin
中的可见性修饰符还是很有几点不同之处的:
1、 四种修饰符的不同。Koltin
的四种修饰符(public、interna、protected、private
),Java
的的四种修饰符(public、protected、privavte、default(即不使用任何修饰符)
)。
2、默认修饰符的不同。Kotlin
的默认修饰符为public
,Java
的默认修饰符为default
。
四、总结
此节主要涉及的知识大部分是理论知识,上面分析了各个修饰符在每一种情况下的范围使用。这一节是很基础的东西,但是越是基础的东西越是容易忘记,甚至记得不清晰,各位可以好好看一下各种情况下的截图,上面写的很是清晰,并且对每一点下面都作了小结。
如果各位大佬看了之后感觉还阔以,就请各位大佬随便star
一下,您的关注是我最大的动力。
我的个人博客:Jetictors
我的掘金:Jetictors
Github:Jetictors
欢迎各位大佬进群共同研究、探索
QQ群号:497071402
最新文章
- sql 删除所有表
- Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次
- 启用WebApi 2里的Api描述信息(Help下的Description)
- *HDU3496 背包DP
- smarty中section遍历数组
- 【CodeForces 614A】Link/Cut Tree
- B/S C/S架构的界面测试
- 利用Roslyn把C#代码编译到内存中并进行执行
- Docker系列
- ClipDrawable 资源
- swift 笔记2
- Android优秀github项目整理
- python-关于字典与列表的一个作业
- [原创]Xilinx工具关联UEStudio
- 日常开发工作常用linux命令
- Salesforce Sales Cloud 零基础学习(四) Chatter
- 破解爱奇艺优酷等Vip视频
- windows server 2012 配置多用户ftp服务器配置注意点
- Out of range value for column ";";
- Python_部分内置函数
热门文章
- 怎样实现广度优先遍历(BFS)
- blog url.txt
- 自行控制loadrunner的socket协议性能测试 (转)
- 插入数据返回插入的主键Id
- 纪念我人生中第一个merge into语句
- C#之正则表达式验证
- eclipse git拉取完代码后怎么maven构建
- Atitit.atiDataStoreService   v2 新特性
- 448. Find All Numbers Disappeared in an Array【easy】
- linux c 和c++ 键盘输入不在控制台显示