一、前言
在学习之前,我们先来了解一下kotlin,在这里,我不会再去介绍kotlin 的发展史,我们直接来说一下我个人对于kotlin 的理解:
- kotlin 包含了大量的语法糖,在编码的时候,会大大的简化我们的代码量及工作效率,kotlin 中的高阶函数,扩展函数,委托,数据类,密封类,集合操作,可空类型等等。相比传统的Java 语言,kotlin 种大量的简写,可以减少很多用Java 必须要写的样板代码,减少大量的 if…else 等嵌套,减少大量接口的实现,代码结构也会更加清晰。
- 目前在安卓开发中,当你查看源码的时候,你会发现大量的kotlin 源码,在使用一些 jetpack 框架的时候,大部分都是kotlin 语言。
- kotlin将成功Android 开发的首选语言, 如compose 开发,就只能使用 kotlin 语言。
二、基本语法
2.1包的定义与导入
包的声明应处于源文件顶部。
package my.demo
import kotlin.text.*
2.2程序入口点
Kotlin 应用程序的入口点是 main 函数。
fun main() {
println("Hello world!")
}
main 的另一种形式接受可变数量的 String 参数。
fun main(args: Array<String>) {
println(args.contentToString())
}
2.3输出打到标准输出
print 将其参数打到标准输出。
fun main() {
//sampleStart
print("Hello ")
print("world!")
//sampleEnd
}
println 输出其参数并添加换行符,以便接下来输出的内容出现在下一行。
fun main() {
//sampleStart
println("Hello world!")
println(42)
//sampleEnd
}
2.4变量
定义只读局部变量使用关键字 val 定义。只能为其赋值一次。
fun main() {
//sampleStart
val a: Int = 1 // 立即赋值
val b = 2 // 自动推断出 `Int` 类型
val c: Int // 如果没有初始值类型不能省略
c = 3 // 明确赋值
//sampleEnd
println("a = $a, b = $b, c = $c")
}
可重新赋值的变量使用 var 关键字。
fun main() {
//sampleStart
var x = 5 // 自动推断出 `Int` 类型
x += 1
//sampleEnd
println("x = $x")
}
可以在顶层声明变量
//sampleStart
val PI = 3.14
var x = 0
fun incrementX() {
x += 1
}
//sampleEnd
fun main() {
println("x = $x; PI = $PI")
incrementX()
println("incrementX()")
println("x = $x; PI = $PI")
}
ps:编译时常量在函数外声明,就可以可以在编译期间初始了
例如:
const val PI =3.14
2.5字节码文件
2.6函数
Kotlin 函数使用 fun 关键字声明:
fun double(x: Int): Int {
return 2 * x
}
带有两个 Int 参数、返回 Int 的函数。
//sampleStart
fun sum(a: Int, b: Int): Int {
return a + b
}
//sampleEnd
fun main() {
print("sum of 3 and 5 is ")
println(sum(3, 5))
}
函数体可以是表达式。其返回类型可以推断出来。
//sampleStart
fun sum(a: Int, b: Int) = a + b
//sampleEnd
fun main() {
println("sum of 19 and 23 is ${sum(19, 23)}")
}
返回无意义的值的函数。
//sampleStart
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
//sampleEnd
fun main() {
printSum(-1, 8)
}
Unit 返回类型可以省略。
//sampleStart
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}
//sampleEnd
fun main() {
printSum(-1, 8)
}
2.7创建类与实例
使用 class 关键字定义类。
class Shape
类的属性可以在其声明或主体中列出。
class Rectangle(var height: Double, var length: Double) {
var perimeter = (height + length) * 2
}
具有类声明中所列参数的默认构造函数会自动可用。
class Rectangle(var height: Double, var length: Double) {
var perimeter = (height + length) * 2
}
fun main() {
//sampleStart
val rectangle = Rectangle(5.0, 2.0)
println(“The perimeter is ${rectangle.perimeter}”)
//sampleEnd
}
类之间继承由冒号(:)声明。默认情况下类都是 final 的;如需让一个类可继承, 请将其标记为 open。
open class Shape
class Rectangle(var height: Double, var length: Double): Shape() {
var perimeter = (height + length) * 2
}
2.8Range
fun main() {
//rang 范围 从哪里 到哪里
val number:Int=99
if (number in 10..59){
println("不及格")
}else if (number in 0..10){
println("分数太低了")
}else if (number in 60..100){
println("已经及格了")
}else if (number !in 0..100){
println("分数不在0-100区间内 出错了")
}
}
2.9when表达式
也必须实现else,否则报错
fun main() {
val s= getScore("Tom")
println(s)
}
fun getScore(name: String) = when(name){
"Tom" -> "不及格"
"Jim" -> "及格"
"Pony" -> "良好"
"Tony" -> "优秀"
else -> "名字非法"
}
when支持参数检查
fun checkNumber(num: Number) {
when (num) {
is Int -> println("Int")
is Double -> println("Double")
else -> println("others")
}
}
2.10String
fun main() {
val location="湖南长沙橘子洲"
var time=6
println("今天天气很好 ,去 ${location} 玩了$time 小时")
}