kotlin是我学习的第四门语言了(c,JavaScript,Java),目前初学的感觉,他和JavaScript是差不多的。作为谷歌的亲儿子,还是可以认真学习下的,相信其他的google出品的如go应当也是差不多的
语言特点
- 无需分号结尾语句
- 自动类型推测
- 当一个引用可能为 null 值时, 对应的类型声明必须明确地标记为可为 null。
基础语法
包
- 定义
package my.example - 导入
import my.demo.*
与Java不同,目录与包的结构无需匹配:源代码可以在文件系统的任意位置。
程序入口(main方法)
fun main() {
println("Hello world!")
}
变量
var a:Int=1
常量
val a:Int
a = 1
const
未被const修饰的属性只能被 get of set 方法调用,而不能直接调用。而const修饰的属性是可以被直接调用的,实际上是等同于Java中的 public static final。
const 只允许在top-level级别(file 级别)和object中声明
函数
关键字 fun
基本结构:
fun + 函数名+参数列表+返回值类型(可不加,默认为Unit类似void)
注意
1 函数可只由一条语句构成,这是一种简写的状态,js中也有类似写法,如:
fun hasPrefix(x:Any) = x is String
fun hasPrefix(x:Int):Int = if(x > 2) x else 2
fun hasPrefix(x:Any) = when(x){
is String -> true
else -> false;
}
字符串拼接
使用 实 现 字 符 串 拼 接 , 实现字符串拼接, 实现字符串拼接,+变量名,或${方法调用}
NULL检查机制
我想这里其实是一个很好的设计,很好的对引用的对象如变量,函数返回值在取Null值得行为这一层面上进行了分类。
- 允许为空 + ?,若为空,那么此条表达式不做处理直接返回
- 不允许为空 + !!,为空则抛出异常 kotlin.KotlinNullPointerException
类型检测及自动类型转换
个人觉得这是个很巧妙的设计,虽然还不知道有什么用…总的来说,kotlin可以使用is或 !is 关键字判断引用类型,类似于Java的instance of,巧妙的是,如果成功的is了,或者逻辑上能够缩小引用的类型范围了,那么会自动转型成对应的类型。
example:
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 做过类型判断以后,obj会被系统自动转换为String类型
return obj.length
}
//在这里还有一种方法,与Java中instanceof不同,使用!is
// if (obj !is String){
// // XXX
// }
// 这里的obj仍然是Any类型的引用
return null
#### 区间范围
这对我是一个全新概念,表示一个区间范围(等差数列集合),参考:
https://www.kotlincn.net/docs/reference/ranges.html
只能用例子实验了:
for(i in 1..10) {
print(i.toString()+" - ")
}
println()
for(i in 10 downTo 1) {
print(i.toString()+" - ")
}
println()
for(i in 1..10 step 2) {
print(i.toString()+" - ")
}
println()
for(i in 10 downTo 1 step 2) {
print(i.toString()+" - ")
}
条件语句
与其他的语言中的if使用所不同的是,我们也可以把 IF 表达式的结果赋值给一个变量。因此kotlin里是没有三元操作符的,完全可以通过if else条件语句替代。需要注意的是,需要换行
code
fun main() {
var a:Int = 3;
var b:Int = 2;
var c = if(a > b) {
println("i choos a")
a}
else {
println("i choos b")
b}
println(c)
分支语句
在kotlin中使用when替代switch
fun main() {
var num:Int = 3;
when(num) {
3 -> println(3333)
2 -> println(2222)
}
}
值得注意的是,他与switch又不是相同的,在我看来算是一个优化版的switch了,如下:
public static void main(String[] args) {
int num = 3;
switch (num){
case 3: {
System.out.println(3333);
}
case 2: {
System.out.println(222);
}
}
}
Java代码会输出 3333 2222。其实一直以来,我就觉得switch中需要额外手动break就是一个过度设计,kotlin解决了这个问题,实际上他更加体现了分支这个词的含义;
- 无需break判断的主语,如果没有传入参数,那么则需要我们自行确定主语如:
fun hasPrefix(x:Any) = when(x){
is String -> true
else -> false;
}
等于
fun hasPrefix(x:Any) = when {
x is String -> true
else -> false;
}
- 不一定需要传入参数,如果传入了参数假设是x,那么x默认为条件
循环语句
for循环
for可分为2种:
- 基于迭代器:
针对collection集合的遍历将会使用collection内置的iteator迭代器 - 遍历数组索引