阅读完需:约 2 分钟
可见性

- 与java不同,kotlin中啥也不写,默认就是
public
的,而java中不写默认是default
包内可见 - kotlin中多一个限制可见性的
internal
关键字,去掉了default
关键字 - 对于
protected
, java是包内可见,而kotlin是类内可见,这点不同,当然子类肯定都是可见的,kotlin中protected
不能用来修饰类和顶级生命


internal
这个关键字比较有意思,可以在kotlin中用作模块化隔离可见性

比如在一个模块中声明:
//internal只在模块内可见,模块外的kotlin访问不到
internal class CoreApiKotlinA {
//指定JvmName使java也不能访问该方法
@JvmName("%abcd")
internal fun a(){
println("Hello A")
}
}
而在依赖它的模块中使用它会报错:
//kotlin中访问其他模块的internal的类会报错 不可见
val coreApiKotlinA = CoreApiKotlinA()
coreApiKotlinA.a()
但是通过java代码却可以使用,此时可以通过internal
方法上添加@JvmName("xxx")
注解指定一个非法的java变量可达到java不能调用的目的,但实际上java是能看到的,只不过不能打出来合法的方法名而已。
//java是可以访问internal的kotlin类的,但是可以指定JvmName使java也不能访问对应方法
CoreApiKotlinA coreApiKotlinA = new CoreApiKotlinA();
coreApiKotlinA.%abcd();
构造器可见性

通过工厂方法来添加对象使需要私有化构造器

私有化属性后只能在内部访问和调用

私有化属性后意味着子类可以访问到这个属性



- get可见性必须和属性可见性一致, 不能定义public属性的get为private
- set可见性不能大于属性的可见性, 不能定义private属性的set为public
