一、包
1.包的定义
我们都知道Java中,包是用关键字package定义,同样的在Kotlin中,也是用package关键字定义
例如:
/*
*
*Demo类的全名是 com.hello.kotlin.Demo,这里跟java中的书写没有任何区别
*
*/
package com.hello.kotlin
class Demo{
}
Kotlin和Java中包定义的区别
#######Java:包名的和路径必须保持一致,如上面Demo类所在包名为:com.hello.kotlin.Demo,那么项目工程中与之对应的包所在路径也必须是:
com
---hello
--------kotlin
这点我们应该是没有任何质疑的,但在Kotlin中却并没有这样的限制
Kotlin:允许包名和路径不同,也就是说Demo类的报名为:com.hello.kotlin.Demo,项目中与之所对应的文件路径可以不必保持一致的:
下面的路径在Kotlin中将被允许
cn
---kotlin
---------hello
2.默认导包
我们知道Java中导包都需要我们手动或使用编译器进行配置了自动导包才能完成的一个操作,但Kotlin中则不同,有很多包会默认导入到每一个kotlin文件中,比如下面这些:
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.* (自 1.1 起)
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
当然,根据所在的不同平台,也会存在其平台特有的包被默认导入到每一个kotlin文件中,如:
JVM
java.lang.*
kotlin.jvm.*
JavaScript
kotlin.js.*
3.导入
如果我们使用的类,不在默认导入中时,就需要我们进行手动导包了,当然Kotlin同样也支持使用编译器实现快捷导包,在AS上的使用和java并没任何区别
导入指定类,例如我们需要导入上述Demo类的包
import com.hello.kotlin.Demo
如果我们需要使用到com.hello.kotlin包中其他的类,最好是希望把该包所有类都导入进来供我们使用,那么像下面这样就可以实现了
import com.hello.kotlin.*//导入com.hello.kotlin下面所有的类,子包等
需要注意的是与Java有点区别,Kotlin中没有import static的语法,所有的类,字段等都是用import语法导入
二、修饰符
1.类,成员修饰符
除了与java共有的public、private、protected、final的外,kotlin还有其特有的修饰符,open、internal
public——能见到类声明的任何客户端都可见其 public 成员。
private——意味着只在这个类内部(包含其所有成员)可见
protected—— 和 private一样 + 在子类中可见
internal——能见到类声明的 本模块内 的任何客户端都可见其 internal 成员
open——只有被open修饰的类才可以被继承,同样的也只有被open修饰的方法才可以被重写
final——被final修饰的类,不可被继承,final修饰的方法不可被重写。默认修饰符
有个和java较大区别需要注意 :对于Java中外部类不能访问内部类的 private 成员,Kotlin 中是不允许外部类不能访问内部类 private 成员<br />
如果你覆盖一个 protected 成员并且没有显式指定其可见性,该成员还会是 protected 可见性
open class Outer {
private val a = 1protected open val b = 2internal val c = 3val d = 4 // 默认 publicprotected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a 不可见// b、c、d 可见// Nested 和 e 可见override val b = 5 // “b”为 protected
}
class Unrelated(o: Outer) {
// o.a、o.b 不可见// o.c 和 o.d 可见(相同模块)// Outer.Nested 不可见,Nested::e 也不可见
}
2.构造函数
要指定一个类的的主构造函数的可见性,使用以下语法(注意你需要添加一个 显式 constructor 关键字):
class C private constructor(a: Int) { …… }
这里的构造函数是私有的。默认情况下,所有构造函数都是 public,这实际上 等于类可见的地方它就可见(即 一个 internal 类的构造函数只能 在相同模块内可见).
模块
可见性修饰符 internal 意味着该成员只在相同模块内可见。更具体地说, 一个模块是编译在一起的一套 Kotlin 文件:
一个 IntelliJ IDEA 模块;
一个 Maven 或者 Gradle 项目;
一次 <kotlinc> Ant 任务执行所编译的一套文件