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.*
- redis主从集群搭建及容灾部署(哨兵sentinel)
- 浅谈ASP.NET的Postback
- redis配置详解(中英文)
- 我所理解的Remoting(1):Marshaling & Activation[下篇]
- 5分钟短视频,带你走进日志易SPL,助你日志分析更容易
- Unity Application Block 1.2 for Silverlight - December 2008
- 算法学堂 - 二分查找及其变形
- Zookeeper权限管理与Quota管理
- 刘鹏:保大还是保小?无人汽车也将面临这样的道德窘境
- 浅谈DNS
- silverlight寻奇 - Graphite
- 程序运算性能测量
- 2018年比特币的真正瓶颈在这里
- 玩转 React 服务器端渲染
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《一起学sentinel》五、Slot的子类及实现之AuthoritySlot和SystemSlot
- Python 之pyaudio使用随笔
- Determining 32 vs 64 bit in C++
- 在线、离线激活鉴权实战
- Spark vs Dask Python生态下的计算引擎
- 表达差异基因分析
- threadlocal记录
- 2020-09-22:已知两个数的最大公约数,如何...
- 【超详细】分布式一致性协议 - Paxos
- MySQL 8.0新特性 — 降序索引
- TRTC横竖屏切换2,重力感应
- Elasticsearch 日志配置详解【技术创作101训练营】
- HashMap源码分析
- SpringBoot分组校验及自定义校验注解
- BERT详解