|
|
1基础定义
Kotlin很明显受到Java、C#、JavaScript、Scala、Groovy等语言的影响。例如Kotlin可以直接通过
()
或
println(")
来使用字符串模板,和古老的shell script类似。又如Kotlin中的分号是可选的,这类似JavaScript,而且Groovy、Scala也有同样的能力。Kotlin常量定义关键字是val(不同于变量定义关键字var),表示固定值,这功能来自Scala,Swift也有类似功能。
需要注意,Kotlin没有关键字new。
变量与常量
使用val(全称为value,即(固定的)值)关键字定义常量,定义后其值无法修改
val a: Int =
val b =
使用var(全称为variable,即变量)关键字定义变量。
x =
x =
函数
使用fun关键字定义一个函数。
(): Int
{
a + b
}
上例定义了一个传入两个Int变量,并返回两数之和的求和函数。
Main进入点
Kotlin的main函数是不依赖类别的,所以main函数是一个top-level函数。支持Perl和Unix/Linuxshell script的字符串插值(String interpolation),同样也支持类型推定。
{
val scope =
println()
}
函数扩展
Kotlin与C#、JavaScript类似,能够扩展类别的新功能,而无需继承该类别,或使用像装饰器(decorator)这样的任何类型的设计模式(design pattern)。扩展函数可以称为Kotlin的核心,在标准库里到处充斥着扩展函数。
扩展函数是静态分发的,也就是说,它们不是以接收者类型为准的虚拟函数。这意味着调用的扩展函数是由函数调用所在的表达式的类型来决定的,而不是由表达式运行时求值结果决定的。
在下述例子中,String类别被扩展出一个成员lastChar。
MyStringExtensions
fun String.Char(): Char = get(length - )
>>> println(.Char())
利用函数扩展,Kotlin也支持运算符重载:
fun Point.plus(other: Point): Point
{
Point(x + other.x, y + other.y)
}
>>> val p1 = Point(, )
>>> val p2 = Point(, )
>>> println(p1 + p2)
Point(x=, y=)
getter和setter
Kotlin像C#一样支持属性(property)。
解包引数
类似Python, 解包(unpack)指的是对实际参数的解包,只需在前面加一个星号* 即可,如test(*a):
{
val = listOf(, *args)
println()
}
函数嵌套
Kotlin支持函数嵌套(nested functions),允许函数内再定义函数,类似JavaScript、C#与Python语言。
(
val id: Int,
val name: String,
val address: String)
{
{
{
(value.isEmpty())
{
IllegalArgumentException(
)
}
}
validate(user, user.name, )
validate(user, user.address, )
}
}
解构声明
Kotlin支持解构声明,这与Python的迭代解包相似。
例如, collection object 包含析构式可分离其元素:
((index, element) collection.withIndex())
{
println(: ")
}
抽象类别
抽象类别(Abstract classes)定义抽象或纯虚拟(Pure Virtual)占位函数,需要被继承。抽象类别默认是open的。
No need the open keyword here, its already open
abstract
{
This virtual function already open well
abstract fun animate()
open fun stopAnimating() { }
fun animateTwice() { }
}
类别属性
Kotlin 提供下列的关键字来限制顶层(top-level)声明,用于控制类别与成员在继承时的可见性(作用域)。它们可用于类别及其成员:
用于类别的成员声明时,含义如下:
public——全局可见。此为默认的类型。
internal——在当前模块中可见。
protected——在当前类别的一级子类中可见,如果子类再被继承,则在下一级子类中不可见。
private——在当前类别中可见。
用于顶层声明时,含义如下:
public——全局可见。此为默认的类型。
internal——在当前模块中可见。
private——在当前文件中可见。
例如:
open :
{
fun () = println()
fun () = println()
}
空变量及其运算
Kotlin对可以为空(nullable)的变量和不可以为空(non-nullable)的变量作了区分。所有的可空对象(nullable objects)必须在定义时加上 "?" 后置于类型之后。开发人员遇到nullable objects时要先确认: null-check 须被运行过,才能赋值。可空性是Kotlin类型系统中帮助开发者避免以往Java的NullPointerException错误的特性。
Kotlin 提供空安全(null-safe)运算符给开发人员:
.(Safe navigation operator) 可用于安全访问(safely access) 可能是空对象的函数或属性。如果 object 为空(null), the method 将不被调用,而且表达式必运算(evaluate)为空(null)。
.(Null coalescing operator) 通常称为艾维斯运算符(Elvis operator):
fun sayHello(maybe: ?, : Int)
{
val name: = maybe ?:
println()
}
使用安全导引(safe navigation)运算符:
/ returns ...
- foo() returns ,
- foo() non-, but bar() returns ,
- foo() bar() are non-, but baz() returns .
vice versa, value non- only foo(), bar() baz() are non-
foo()?.bar()?.baz()
2演绎过程
2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言,它已被开发一年之久。JetBrains负责人Dmitry Jemerov说,大多数语言没有他们正在寻找的特性,但是Scala除外。但是,他指出Scala的编译时间过慢这一明显缺陷。Kotlin的既定目标之一是像Java一样快速编译。2012年2月,JetBrains以Apache 2许可证开源此项目。
Jetbrains希望这个新语言能够推动IntelliJ IDEA的销售。
Kotlin v1.0于2016年2月15日发布。这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性。
在Google I/O2017中,Google宣布在Android上为Kotlin提供最佳支持。
3设计目标
创建一种兼容Java的语言
让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针
让它比Java更简洁,通过支持variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation等实现。
让它比最成熟的竞争对手Scala语言更加简单。[2]
4开放源码
其基础编译器(他们将其改为kompiler——开创了一系列以K字打头的用语——甚至连 contributors这类词他们也用改成了kontributors)可以被独立出来并嵌入到 Maven、Ant 或 Gradle 工具链中。这使得在 IDE 中开发的代码能够利用已有的机制来构建,从而尽可能的减少了在新环境中使用所受的干预,哪怕与那些没有安装 Kotlin 插件的开发人员一起合作项目也没有问题。
The IntelliJ Kotlin 插件扩展了 Java 编译器使得 Kotlin 代码能够得以编写、编译和调试。除此之外,关于基本的 Java 集合,已经有编写好的帮助函数,可以更顺畅地衔接将在 Java 8 中出现的集合扩展。
有两篇文章对 Kotlin 与 Java 以及 Kotlin 与 Scala 分别进行了比较,对各自特性和异同进行了对比。即便 Scala 可能还是更为强大些,Kotlin 还是尝试着提供比 Java 更好的函数、模式匹配、空指针预防和泛型。该语言同时也支持特征(traits)和模式匹配。
Kotlin 插件在当前版本的 IntelliJ 和 Eclipse 中均已能使用。
5文化特色
吉祥物
2023年4月26日,据JetBrains官方博客消息,编程语言Kotlin迎来新设计的吉祥物,名为Kodee。Kodee是从2021年首次发布的Kotlin吉祥物改版而来,当时的设计受到了用户的批评和反对,因此时隔两年又推出了新设计。
Kodee的造型经过了扁平化改造,颜色也从黑白配色改为黑紫配色,官方号称“创建了一个与Kotlin社区相关的平易近人且有趣的角色”。[3]
评论