Kotlin
本文最后更新于16 天前,其中的信息可能已经过时,如有错误请发送邮件到kirasu@qq.com

Kotlin 基础完整学习笔记 + 可运行案例

建议:新建 Kotlin/JVM Library 模块运行下面所有代码,不要放在 Android app 模块,避免SourceSet报错。

1. 变量声明 val /var

  • val:只读(final),赋值后不能修改,优先使用 val
  • var:可变,可以重新赋值
  • Kotlin 类型自动推导,很多时候不用写:类型

    fun main() {
    // val 只读,不可修改
    val name: String = "张三"
    // name = "李四" //编译报错!val不能二次赋值
    
    // var 可变变量
    var age: Int = 18
    age = 22
    
    // 类型自动推导,编译器自动识别类型,可以省略类型
    val height = 175.3 // Double
    val isStudent = true // Boolean
    
    println(name)
    println(age)
    println(height)
    }

    2. 基础数据类型

    表格

类型 说明 示例
Int 整数 val a:Int = 10
Double 小数双精度 val d = 3.14
Float 单精度小数 val f = 3.14f
Long 长整型 val l = 1000L
Boolean 布尔 val b = true / false
Char 单个字符 val c = ‘A’
String 字符串 val str = “hello”

Kotlin 没有基础原始类型,全部都是对象。

3. 字符串模板 $

$变量名 直接嵌入字符串;复杂表达式 ${表达式}

fun main() {
    val name = "小明"
    val age = 20
    // 简单变量 $
    val info1 = "姓名:$name,年龄:$age"
    // 表达式 ${ }
    val info2 = "明年年龄:${age + 1}"

    println(info1) //姓名:小明,年龄:20
    println(info2) //明年年龄:21

    // 多行字符串 """
    val multiStr = """
        第一行文本
        第二行文本
        姓名=$name
    """.trimIndent()
    println(multiStr)
}

4. 可空类型 ? 、安全调用 ?. 、Elvis 运算符 ?:

Kotlin 默认变量不能为 null,想要存 null 必须加?声明可空类型

  • 变量?:标记这个变量允许为 null
  • ?.:安全调用,变量为 null 的时候,直接返回 null,不会空指针崩溃
  • ?: Elvis,如果左边结果是 null,返回右边默认值
  • !!:强制非空,告诉编译器一定不为 null,为 null 会直接崩溃,开发尽量少用

    fun main() {
    // 普通String,不能赋值null
    // var str:String = null //编译报错
    
    // ? 可空类型,可以存null
    var phone: String? = null
    
    phone = "13912345678"
    
    //安全调用 ?.length ,如果phone=null不会报错
    println(phone?.length)
    
    // Elvis ?: null的时候返回默认值0
    val len = phone?.length ?: 0
    println(len)
    
    phone = null
    val len2 = phone?.length ?: -1
    println(len2) //-1
    
    // !! 强制非空,phone=null会直接抛出空指针异常,慎用
    // println(phone!!.length)
    }

    5. 条件判断 if-else

    Kotlin 中 if 是表达式,可以有返回值,不需要三元运算符

    fun main() {
    val score = 75
    // 普通if else
    if (score >= 60) {
        println("及格")
    } else {
        println("不及格")
    }
    
    // if作为表达式,返回结果赋值给变量
    val result = if (score >=60) "及格" else "不及格"
    println(result)
    }

    6. when 多分支(替代 Java switch)

    支持常量、区间、条件判断,强大很多

    fun main() {
    val num = 3
    when(num){
        1 -> println("数字1")
        2 -> println("数字2")
        3 -> println("数字3")
        else -> println("其他数字")
    }
    
    // when表达式,返回值
    val msg = when(num){
        1 -> "一"
        2 -> "二"
        in 3..10 -> "3到10之间" //区间判断
        else -> "未知"
    }
    println(msg)
    }

    7. 循环 for /while

    for 循环

    fun main() {
    // 区间 1..10  [1,10] 包含10
    for(i in 1..10){
        print("$i ")
    }
    println()
    
    // until:不包含结束值 1 until 10 →19
    for(i in 1 until 10){
        print("$i ")
    }
    println()
    
    // step 步长
    for(i in 1..10 step 2){
        print("$i ")
    }
    println()
    
    // downTo 倒序
    for(i in 10 downTo 1){
        print("$i ")
    }
    println()
    
    //遍历集合
    val list = listOf("苹果","香蕉","橙子")
    for(item in list){
        println(item)
    }
    }

    while / do while

    fun main() {
    var i = 0
    while(i < 5){
        println(i)
        i++
    }
    
    // do while 至少执行一次
    var j =0
    do {
        println(j)
        j++
    }while(j<3)
    }

    8. 函数 fun

    语法:fun 函数名(参数:类型):返回值类型 { }

  • 返回值 Unit等价 Java void,可以省略不写
    
    //无返回值
    fun sayHello(name: String){
    println("Hello $name")
    }

//有返回值 Int
fun add(a:Int, b:Int): Int{
return a + b
}

//单表达式函数,可以简化写法,省略return
fun addShort(a:Int,b:Int) = a + b

//参数默认值
fun showInfo(name:String, age:Int = 18){
println(“姓名:$name 年龄:$age”)
}

fun main() {
sayHello(“Kotlin”)
println(add(3,5))
println(addShort(2,4))
showInfo(“张三”) // age使用默认值18
showInfo(“李四”, 25)
}

## 9. 类与对象 class

//普通类
class Person {
var name: String = “”
var age: Int = 0

fun show(){
    println("name=$name age=$age")
}

}

//主构造函数简写(最常用)
class Student(val name: String, var age: Int) {
fun printInfo(){
println(“学生:$ name,$age岁”)
}
}

fun main() {
val p = Person()
p.name = “老王”
p.age = 30
p.show()

val s = Student("小张",16)
s.printInfo()
// s.name = "aaa" // val只读,不能修改
s.age =17 // var可以修改

}


## 伴生对象 companion object
相当于 Java 静态成员,Kotlin 没有 static 关键字

class Demo{
companion object{
val VERSION = “1.0”
fun staticFunc(){
println(“伴生对象函数,类似静态方法”)
}
}
}

fun main() {
println(Demo.VERSION)
Demo.staticFunc()
}

## 10. 集合 List / MutableList;Set / Map
* 只读集合:listOf(),不能增删改
* 可变集合:mutableListOf(),可以 add remove

fun main() {
//只读List
val list = listOf(“A”,”B”,”C”)
println(list[0])

//可变List
val mList = mutableListOf<String>()
mList.add("张三")
mList.add("李四")
mList.remove("张三")
println(mList)

// Map 键值对
val map = mapOf("a" to 1, "b" to 2)
println(map["a"])

val mMap = mutableMapOf<String,Int>()
mMap["key1"] = 100
println(mMap["key1"])

}

## 11. 空安全综合完整案例(你截图那套代码完整版)

fun main() {
// val只读
val name: String = “张三”

// var可变
var age: Int =18
age =20

//自动推导类型
val height =175.5

//字符串模板
val info = "姓名:$name,年龄:$age,身高:${height}cm"
println(info)

//可空类型
var phone: String? = null
phone = "13800138000"

//安全调用 ?.
println(phone?.length)

//Elvis ?:
val len = phone?.length ?: 0
println(len)

}


## Kotlin 学习顺序建议

1.val/var、基础数据类型
2.字符串模板
3.可空类型??. ?:(Kotlin 最重要特性,区分 Java)
4.if-else、when、循环
5.函数 fun、默认参数
6.类、构造函数、伴生对象
7.集合 List/Map
8.继承、接口、数据类 data class
9.Lambda、高阶函数
10.协程(Android 开发重点)
Text(
    text = "张三今年18岁",
    color = Color.Red,                 //文字颜色
    fontSize = 20.sp,                  //字号 sp
    fontWeight = FontWeight.Bold,      //字重(粗体)
    fontStyle = FontStyle.Italic,      //斜体
    letterSpacing = 2.sp,              //字间距
    lineHeight = 30.sp,                //行高
    maxLines = 2,                      //最大显示行数
    overflow = TextOverflow.Ellipsis,  //文字溢出:...省略号
    textAlign = TextAlign.Center,      //文字对齐
    textDecoration = TextDecoration.Underline, //下划线
    modifier = Modifier
        .background(Color.LightGray)   //文字背景底色
        .padding(10.dp)                //内边距
)
## 逐个解释
### 1. 字体粗细 fontWeight
fontWeight = FontWeight.Bold     //粗体
fontWeight = FontWeight.Normal   //正常(默认)
fontWeight = FontWeight.Light    //细体
### 2. 斜体 fontStyle
fontStyle = FontStyle.Italic   //斜体
fontStyle = FontStyle.Normal   //正常
### 3. 字间距 letterSpacing 字符之间拉开距离
letterSpacing = 1.sp
### 4. 行高 lineHeight,多行文字每行之间距离
lineHeight = 28.sp
### 5. 行数控制、文字溢出(长文本)
maxLines = 1,                          //只允许1行
overflow = TextOverflow.Ellipsis,       //超出显示 …
// overflow = TextOverflow.Clip        //直接截断切掉
// overflow = TextOverflow.Visible    //全部显示,溢出
### 6. 文字对齐 textAlign
textAlign = TextAlign.Center     //居中
textAlign = TextAlign.Start      //靠左(默认)
textAlign = TextAlign.End        //靠右
textAlign = TextAlign.Justify    //两端对齐
⚠️注意:textAlign生效需要 Text 本身有足够宽度,Modifier.fillMaxWidth ()
Text(
    "张三今年18岁",
    textAlign = TextAlign.Center,
    modifier = Modifier.fillMaxWidth()
)
### 7. 下划线、删除线 textDecoration
textDecoration = TextDecoration.Underline      //下划线
textDecoration = TextDecoration.LineThrough   //删除线(划掉文字)
textDecoration = TextDecoration.None          //无装饰默认
8.modifier 给 Text 组件加修饰(背景、边距)
modifier = Modifier
    .background(Color(0xFFEEEEEE)) //背景颜色
    .padding(horizontal = 15.dp, vertical = 8.dp)
    .fillMaxWidth()
### 8. 使用现成 Material3 文字样式(推荐正式项目)
不用自己写一堆 fontSize、fontWeight,直接套主题样式
Text(
    "张三今年18岁",
    style = MaterialTheme.typography.titleMedium
)
1️⃣ 显示文字:Text
var age = 20
Text("小李今年$age 岁", fontSize = 20.sp, color = Color.Black)
2️⃣ 输入框:OutlinedTextField(你写奇偶判断用过)
用户输入文字
var inputText by remember { mutableStateOf("") }
OutlinedTextField(
    value = inputText,
    onValueChange = { inputText = it },
    label = { Text("请输入名字") }
)
3️⃣ 按钮:Button / ElevatedButton
点击触发事件
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
    Text("点击:$count")
}

// 凸起按钮
ElevatedButton(onClick = {}) {
    Text("凸起按钮")
}

//文字按钮,无背景
TextButton(onClick = {}) {
    Text("文字按钮")
}
4️⃣ 布局容器(放别的控件)
Column:垂直排列(从上往下)
Column {
    Text("第一行")
    Text("第二行")
}
Row:水平排列(从左往右)
Row {
    Text("左边")
    Text("右边")
}
Box:层叠布局,控件可以重叠
Box {
    Text("底层文字")
    Text("盖在上面", color = Color.Red)
}
5️⃣ 复选框 Checkbox
勾选、取消勾选
var checked by remember { mutableStateOf(false) }
Checkbox(
    checked = checked,
    onCheckedChange = { checked = it }
)
Text(text = if(checked) "已勾选" else "未勾选")
6️⃣ 单选按钮 RadioButton
多选一
var selectId by remember { mutableStateOf(1) }
Row {
    RadioButton(
        selected = selectId ==1,
        onClick = { selectId =1 }
    )
    Text("选项A")

    RadioButton(
        selected = selectId ==2,
        onClick = { selectId =2 }
    )
    Text("选项B")
}
7️⃣ 开关 Switch
类似手机设置开关
var switchState by remember { mutableStateOf(false) }
Switch(
    checked = switchState,
    onCheckedChange = { switchState = it }
)
8️⃣ 滑块 Slider
拖动选择数字
var progress by remember { mutableStateOf(50f) }
Slider(
    value = progress,
    onValueChange = { progress = it },
    valueRange = 0f..100f
)
Text("当前数值:${progress.toInt()}")
9️⃣ 图片 Image
显示图片资源
Image(
    painter = painterResource(id = R.mipmap.ic_launcher),
    contentDescription = "图标",
    modifier = Modifier.size(60.dp)
)
🔟 分割线 Divider
画一条横线做分隔
Divider(thickness = 1.dp, color = Color.Gray)
11️⃣ 列表 LazyColumn(最重要!长列表,替代 ListView)
滚动列表,类似 RecyclerView
val list = remember { mutableStateListOf("苹果","香蕉","橙子") }
LazyColumn {
    items(list) { item ->
        Text(item, modifier = Modifier.padding(10.dp))
    }
}
12️⃣ 下拉菜单 DropdownMenu
下拉选择框
var expand by remember { mutableStateOf(false) }
var selectText by remember { mutableStateOf("请选择") }

Button(onClick = { expand = true }) {
    Text(selectText)
}
DropdownMenu(expanded = expand, onDismissRequest = { expand=false }) {
    DropdownMenuItem(text={Text("北京")}, onClick = { selectText="北京"; expand=false })
    DropdownMenuItem(text={Text("上海")}, onClick = { selectText="上海"; expand=false })
}
13️⃣ Card 卡片
带圆角阴影卡片容器
Card(modifier = Modifier.padding(10.dp)) {
    Text("卡片里面的文字", modifier=Modifier.padding(16.dp))
}

## 快速记忆分类

1.显示类:Text、Image
2.输入交互:OutlinedTextField、Checkbox、RadioButton、Switch、Slider
3.点击:Button、ElevatedButton、TextButton
4.布局容器:Column(垂直)、Row(水平)、Box(层叠)、Card
5.滚动列表:LazyColumn(垂直列表) / LazyRow(水平列表)
6.辅助:Divider分割线
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇