Kotlin 包和 import 语句使用

Kotlin 包和 package 语句

Kotlin 包与 Java 包的概念是一样的,都表示文件结构(语法上并不严格要求),可以起到区分同名源代码文件、组织项目结构的作用。

不过,由于允许包级函数和包级属性的存在,Kotlin 包的内容更加丰富,不像 Java 包只包含类和接口。

与 Java 源文件相同,Kotlin 源文件至多有一个 package 语句,必须放在第一行(除注解外),多个文件层次间使用点号分隔:

package foo.bar

此外,Kotlin 的 package 语句前可以有注解,这些注解不是针对 package 语句的,而是针对整个 Kotlin 源文件的,要在注解前加上 @file: 标识符。主要有两个: @kotlin.jvm.JvmName(val name: String): 这个注解可以用来修饰文件和函数,用来指定目标元素编译后的名称。对于一个 Kotlin 源文件来说 ,使用这个注解可以指定以 Kt 结尾的“文件类”的名称。 @kotlin.jvm.JvmMultiFileClass: 这个注解只能用来修饰文件,用来告诉 Kotlin 编译器:这个文件里定义的包级函数和包级属性,都只是一个 class 文件的一部分,这个 class 文件还有一部分定义在其他文件里。这个注释一般与上面的 JvmName 配合使用:

// kotlin.util.Synchronized.kt
@file:kotlin.jvm.JvmMultiFileClass
@file:kotlin.jvm.JvmName("StandardKt")
package kotlin
inline fun <R> synchronized(lock: Any, block: () -> R): R {/*...*/}

Synchronized.kt 文件用这两个注解表示这里的 synchronized() 函数应该包含在 StandardKt.class 文件里,这个 class 的另一部分在 Standard.kt 文件里。

import 语句

上面我们说到,Kotlin 包内的元素比 Java 包更为丰富,除类和接口外,还有函数和属性。因此 Kotlin 的 import 语句除了可以导入类和接口外,还可以导入包级函数和包级属性。

与 Java 相同,Kotlin 允许在 import 语句的最后用一个星号 * 来导入一个 Kotlin 或 Java 包内的所有元素。

Kotlin 不允许导入的元素重名,一旦出现重名,就需要用 as 自定义导入名称:

import foo.a.Bar
import foo.b.Bar as BBar

我们这里导入了两个不同包下的 Bar 类,如果不使用 as 重新定义导入名称,就会出现编译错误。这里我们将 foo.b.Bar 导入为 BBar,我们在这个文件里调用 foo.b.Bar 类时就要用 BBar 的名称,调用 foo.a.Bar 时仍然用 Bar 的名称。

包级函数和包级属性的导入使用 import 包名.函数名 / 属性名 的形式,并不需要写出文件名。

// test.Test.kt
fun sayHello() = println("Hello")
val a = 10

Kotlin 文件的导入方式如下:

import test.Test.sayHello
import test.Test.a

Java 文件的导入方式如下:

import test.TestKt;

TestKt.sayHello();
System.out.println(TestKt.a)

或者用 import static 静态导入:

import static test.TestKt.sayHello;
import static test.TestKy.a;

sayHello();
System.out.println(a);

需要注意,Kotlin 没有 Java 中的 import static 用法,如果需要导入一个 Java 类的静态方法,可以用 import Java 类.静态方法 的形式;如果导入一个 Kotlin 类在伴生对象里定义的静态方法,可以用 import Kotlin 类.Companion.静态方法 的形式:

// Test.kt
package test
class TestKotlin {
    companion object {
        fun printWorld() = println("World")
    }
}
// Test.java
package test;
public class TestJava {
    public static void printHello() {
        System.out.println("Hello");
    }
}

可以这样导入这两个静态方法:

import test.TestKotlin.Companion.printWorld
import test.TestJava.printHello

fun main(vararg args: String) {
  printHello()
  printWorld()
}

Kotlin 默认导入以下的包:

Kotlin 包

kotlin.、kotlin.annotation.、kotlin.collections.、kotlin.comparisons.、kotlin.io.、kotlin.ranges.、kotlin.sequences.、kotlin.text.

JVM 平台:

java.lang.、kotlin.jvm.

JavaScript 平台:

kotlin.js.*

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

java在指定目录下执行dos命令或者bat文件

直接看源程序吧 public static void main(String[] args) throws IOException { File dir =...

4905
来自专栏个人随笔

Java IO流

package cn.bdqn.demo; import java.io.File; import java.io.FileInputStream; impo...

2816
来自专栏Kotlin源码阅读

kotlin源码阅读——字符串

filename:String.kt/StringsJVM.kt/Arrays.kt/CharSequence.kt

4424
来自专栏程序员宝库

Java编程常见问题汇总(一)

字符串连接误用 错误的写法: String s = ""; for (Person p : persons) { s += ", " + p....

3689
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第15章 Kotlin 文件IO操作、正则表达式与多线程第15章 Kotlin 文件IO操作与多线程《Kotlin极简教程》正式上架:

我们在使用 Groovy 的文件 IO 操作的时候,感觉非常便利。同样的Kotlin也有好用的文件 IO 操作的 API。同样的在 Kotlin 中对 Java...

1722
来自专栏JMCui

Java 文件流操作.

    在Java中,文件的输入和输出是通过流(Stream)来实现的。一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是 ...

2713
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十二天 IO-高效流(缓冲流)&转换流【悟空教程】

在我们学习字节流与字符流的时候,大家都进行过读取文件中数据的操作,读取数据量大的文件时,读取的速度会很慢,很影响我们程序的效率,那么,我想提高速度,怎么办?

1273
来自专栏日常分享

JSP/Servlet Web 学习笔记 DaySix —— EL表达式

1)EL从scope中得到参数时可以自动转换类型,因此对于类型转换的限制更加宽松。

933
来自专栏desperate633

Java中的异常处理2堆栈追踪finally自动尝试关闭资源语法

想要知道异常的根源,以及多重方法调用下异常的传播,可以利用异常对象自动收集的堆栈的追踪来取得相关信息,例如,调用调用异常对象的printStacktrace()...

792
来自专栏别先生

Java中IO流,输入输出流概述与总结

总结的很粗糙,以后时间富裕了好好修改一下。 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中, 所有输入流类都...

2225

扫码关注云+社区

领取腾讯云代金券