Kotlin可见修饰符_kotlin 模块内可用_天涯无芳草海角无石穿的博客-CSDN博客
Kotlin可见修饰符使用
kotlin可见修饰符和java中的类似,同样使用的是public 、protected、private修饰符,不过在kotlin中默认的是public,在java中默认的修饰符是包私有,在kotlin中只把包当作在命名空间中组织代码的一种方式使用,并没有对其做可见性控制,而是提供了一个新的修饰符,internal来替代。
修饰符 类成员 顶层声明
public 所有地方可见 所有地方可见
internal 模块内可见 模块内可见
protected 子类中可见 不可用
private 类中可见 文件中可见
1.模块内可见Internal
kotlin模块是指一组编译在一起的kotlin文件:
一个Intellij IDEA模块
一个Maven或Gradle工程
一组调用Ant编译的文件
在Java中第三方库中包私有的类,可以在项目中建立和包私有的类的包名一样的类,就可以轻松的访问到这个包私有的类。在kotlin中,开发工程和第三访库不属于一个模块,所以用Internal可以解决java中的这个问题。
2.private
在java很少用private来修饰一个类的可见性,一般只会用在内部类,因为java的类不存在属于某个文件,所以用private来修饰非内部类,没有任何意义。在Kotlin中,类可以属于当前的Kotlin文件,所以当用private来修饰类的时候,表示这个类只能在当前文件中可访问。
package com.example.myapplication
private class Test01Class{
internal var a = 1
}
package com.example.myapplication
class Test02Class {
//此处提示编译错误
val test01Class = Test01Class()
}
3.protected
在Java中protected修饰的内容作用域是包内、类及其子类可以访问,而在Kotlin中没有包作用域,所以protected的作用域只有类及其子类
package com.example.myapplication
private open class Test01Class{
protected var a = 1
}
class TestClass{
private val test01Class = Test01Class()
fun test(){
//此处提示编译错误
test01Class.a
}
}
private class Test01ChildClass: Test01Class() {
fun test(){
a=2
}
}
从上面例子可以看出变量a只能在子类中可用。并且当Test01Class修改符为private时,子类的修饰也必须为private,并且在TestClass中声明一个test01Class时,修饰符也必须时private。一个通用的规则:类的基础类型和类型参数列表中用到的所有类,或者函数的签名都有与这个类或者函数本身相同的类型。
扩展函数不能访问类中用private和protected修饰的成员
参考