Kotlin 到底是什么?它是一种针对 Java 平台的新编程语言。 Koti in 洁、安全、 务实,并且专注于与 Java 代码的互操作性。它几乎可以用在现在 Java 使用的任何 地方:服务器端开发、 Android 应用, 等等。 Kotlin 可以很好地和所有现存的 Java 库和框架 起工作,而且性能水平和 Java 旗鼓相当。在这一章中,我们将详细地探 Kotlin 主要特征:函数和变量
目录
一、函数
1.1 函数声明
Kotlin 中使用 fun 关键字声明函数
完整的函数声明:
修饰符(默认public)+ fun + 函数名 + (参数列表) :返回值 {
函数体
}
1.2 表达式函数体
由单个表达式构成的完整的函数体,井去掉花括号和 return 语句,函数的返回值类型编译器也会自动推断。
这种函数就是表达式函数。
语句和表达式
语句 | 表达式 |
总是包围着它的代码块中的顶层元素,并且没有自己的值 | 能作为另一个表达式的一部分使用,并且有返回值 |
在 Java 中,所有的控制结构都是语句 | 在 Kotlin 中,所有的控制结构 除了循环( for, do do/while )以外大多数都是表达式 比如if- when 以及try |
Kotlin 中赋值操作反而变成了语句 | Java 中的赋值操作是表达式 |
无返回值的函数
fun printSum(a: Int, b: Int): Unit {
print(a + b)
}
// 对于public修饰的方法,如果是返回 Unit类型 可以省略
public fun printSum(a: Int, b: Int) {
print(a + b)
}
可变长参数函数
参数用 vararg 关键字标识(多在Api,源码时用到)
fun vars(vararg v:Int){
for(vt in v){
print(vt)
}
}
// 测试
fun main(args: Array<String>) {
vars(1,2,3,4,5) // 输出12345
}
顶层函数
.kt文件下所定义的函数,放在代码文件的顶层,不用附属于任何一个类,相当于 Java 中的静态函数。
包内可以直接使用,包外只需要import该顶层函数。
package com.example.basicslibrary
fun replaceStrLength(str:String):Int{
if (str!=null){
return str.length
}
return 0
}
// 测试
fun main(args: Array<String>) {
var str="春,夏,秋,冬"
print(replaceStrLength(str) )// 输出7
}
扩展函数
可以为已经存在的类添加新的方法,并且不会修改原来的类。
只需要把扩展的类或者接口名称,放到即将要添加的函数名前面。这个类或者名称就叫做接收者类型,类的名称与函数之间用"."调用连接。this可有可无,指代接收者对象,它可以访问扩展的这个类可访问的方法和属性。并且扩展函数不能访问private的成员。
fun String.lastChar():Char{
return this.get(this.length - 1)
}
// 测试
fun main(args: Array<String>) {
//调用扩展函数
print("EUSAN".lastChar() )// 输出 N
}
二、变量
变量声明
可变变量定义:var 关键字
var <标识符> : <类型> = <初始化值>
不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)
val <标识符> : <类型> = <初始化值>
指定变量的类型,编译器会根据其初始化器的类型进行推断。
如果变量没有初始化器,编译器会根据其初始化器的类型进行推断。
顶层变量
.kt文件下所定义的变量,属性放在文件的顶层,不附属与任何一个类
Java调用顶层变量原理
java访问该顶层属性时,通过访问器进行访问的。通过反编译查看其转换为Java原本样子 ,顶层属性被定义为私有的静态对象,并配套了一个静态访问器方法。
如果需要定义public的静态变量,可以用const关键字修饰该变量。(仅适用于基础数据类型和String类型的属性)
//Kotlin
const val daqiField :String = "daqi"
//Java
public static final String daqiField = "daqi";
三、字符串模板
Java 中,需要字符串连接,输出变量时往往采用如下打印
//Kotlin
println("Hello, $name !")
//Java
println("Hello, "+ name +"!")
Kotlin 支持字符串模板,可以在字符串字面值中引用局部变 ,只需要在变量名称前面加上字符$。
表达式会进行静态检查,如果使用$字符引用一个不存在的变量,代码根本不会编译。
在$引用表达式内(即{}中),不仅限于简单的变量名称,还可以引用复杂的表达式 用花括号括起来
在$引用表达式内(即{}中),嵌套双引号
//嵌套表达式
var array= arrayListOf(1,2,3,4,5,6)
if(array.size>0) {
println(" array[0] ${array[0}")
}
//嵌套双引号
println("hello ${if (args.size > 0) args[O] else "somene"}!")
四、类和属性
类声明
//在 Kotlin 中,public 是默认的可见性,所以你能省略它
//初始化器 getter 和 setter 都是可选的,如果类型可以从初始化器中推断出来,也可以省略。
data class Person(var name:String,var age:Int?=0)
Kotlin转换Java实现
Tools ->Kotlin -> Show Kotlin Bytecode -> 右侧弹出字节码框 ->左上角 Decompile按钮
转换成java后发现,整体基本和Java类相似,但是该类被定义为final类,不可被继承。
类中声明属性
在类中声明属性和声明变量一样:使用 val 和var 关键字。
当你声明属性的时候,也就声明了对应的访问器(即get和set)
声明成 val 是只读的属性 有一个getter访问器 ,而var是可变属性 既有 getter 也有 setter访问器 。
声明白定义的访问器
如果有需要 ,可以声明白定义的访问器,提供额外逻辑
data class Person(var name:String,val age:String){
var isSex:Boolean=false
//此处可以根据lambda表达式语法规则简写
//1.数据类型可以省略,因为由编译器推断得出,称为"类型推断"
//2.只需要一个参数时,参数的小括号可以省略
//3.有一条语句时,return与大括号若有,都可以省略
//小口诀,叫做拷贝中括号,写死右箭头,落地大括号(规则很多此处省略,重点是Kotlin)
// get()= height==width
get(){
return name==age
}
//使用特殊的标识符field来访问支持字段(幕后字段)的值
set(value) {
field = value
}
}
类中变量使用
Kolin中,名称以is开头的变量。getter不会添加任何的前缀,setter名称中的is会被替换成set。