Kotlin学习之基本语法
前言
Kotlin是一种可以运行在Java虚拟机上的静态类型编程语言,由JetBrains公司(开发IDEA的那个)设计开发并开源。
程序入口点
复制fun main(args: Array<String>) {
println("Hello world")
}
类似java的main()方法,不过不需要放在类中,println()方法底层就是java的System.out.println(message)
。
函数定义
复制fun sum(a: Int, b: Int): Int {
return a + b
}
有返回值
复制fun myPrint(a: Int): Unit {
print(a)
}
无返回值,Unit类似java的void,可以省略。
复制fun sum2(a: Int, b: Int): Int = a + b
函数体为表达式
变量定义
复制fun main(args: Array<String>) {
var num1: Int = 12
var num2 = 12 // 类型自动推导
val num3 = 13
}
var
定义可变变量,val
定义不可变变量,类似java中的final,kotlin中都是对象,没有基本类型
模板字符串
复制fun main(args: Array<String>) {
var age = 23
var name = "lisi"
var user = "$age,$name"
println(user)//23,lisi
user = "$age,${name.toUpperCase()}"
println(user)//23,LISI
}
转义字符串
复制fun main(args: Array<String>) {
var age = 23
var str = """
hello world
age=$age
""".trimIndent()
println(str)
}
也可以叫做多行字符串,其中的换行符等会自动转义,其中也支持模板。
null值检查
复制fun main(args: Array<String>) {
// var str:String = null // 不允许一个null值赋值给一个非null的类型
var str: String? = null // 允许,表示该值可能为null
println(str?.toInt()) // 如果str为null,不做处理直接返回null
println(str?.toInt() ?: 23) // 如果str为null,取默认值23
println(str!!) // 如果str为null,抛出空指针异常
}
正常我们声明的变量都是不能为null的,使用[类型]?
格式声明可能为null的值,Int
和Int?
不是同一种类型
类型自动转换
复制fun main(args: Array<String>) {
println(len("hello")) //5
println(len(arrayOf(1, 2, 3))) //3
println(len(listOf("a", "b")))//2
println(len(mapOf(Pair("a", "b"))))//1
println(len(12))//null
}
fun len(obj: Any): Int? { // Any类似java的Object,表示所有类型的父类
if (obj is String) { // is 类似java的instanceof
// 此时obj已经自动转换成了String类型
return obj.length
}
if (obj is Array<*>) { //数组类型
return obj.size
}
if (obj is Collection<*>) { //集合类型
return obj.size
}
if (obj is Map<*, *>) { //Map类型
return obj.size
}
return null
}
区间
复制fun main(args: Array<String>) {
var range = 1..10 step 2 //表示从1到10,步长为2,等同于 1.rangeTo(10).step(2)
var range2 = 9 downTo 1 step 2 //表示从9到1,步长为2,等同于 9.downTo(1).step(2)
for (i in range) { //13579
print(i)
}
println()
for (i in range2) { //97531
print(i)
}
}
实际类型为IntProgression,包含起始位置,结束位置,步长。注意,此区间为左闭右闭,和java中不一样。
数组
复制fun main(args: Array<String>) {
//intArrayOf()方法参数为可变参数类型
val nums = intArrayOf(1, 2, 3) //arrayOf()支持所有类型
//获取指定索引值
println(nums[0])
println(nums.get(0))
//设置指定索引值
nums[0] = 10
nums.set(0, 10)
//使用工厂函数创建数组
val nums2 = IntArray(5, { i -> i * i }) //[0, 1, 4, 9, 16]
println(nums2.asList())
}
kotlin数组功能更加强大
When表达式
复制fun main(args: Array<String>) {
val score = 70
when (score) {
100 -> println("满分")
in 90..99 -> println("优")
else -> println("不及格")
}
}
类似java中的switch,功能更加强大
For循环
复制fun main(args: Array<String>) {
//遍历数组
val nums = intArrayOf(1, 2, 3)
for (num in nums) {
println(num)
}
//遍历集合
val names = listOf("李四", "张三")
for (name in names) {
println(name)
}
//遍历集合,包含索引和值
for (withIndex in names.withIndex()) {
println("${withIndex.index}:${withIndex.value}")
}
}
类似java中的增强for循环,可以遍历任何提供了迭代器的对象
集合
复制fun main(args: Array<String>) {
//不可变集合
val languages = listOf("java", "javascript", "python")
//集合处理
languages.filter { it.length == 2 }
.map { it.toUpperCase() }
.sorted()
.forEach { println(it) }
println(languages.toList() == languages) //true
println(languages.toList().equals(languages))//true
println(languages.toList() === languages) //false
//可变集合
val languages2 = mutableListOf("java", "javascript", "python")
languages2.add("golang")
}
注意,集合调用filter()等方法处理之后返回的是一个新的集合,这点和java中Stream处理有区别。
kotlin中==
的效果和equals()效果一致,比较两个对象的内容。
===
的效果为比较两个引用是否指向同一个对象,类似java中的==
。
kotlin中严格区分可变集合(List)与不可变集合(MutableList)。
注释嵌套
复制/*
/*
*/
*/
java中不支持
使用kotlinc命令编译kotlin代码
复制kotlinc TestKotlinFirst.kt
kotlinc TestKotlinFirst.kt -d TestKotlinFirst.jar
kotlinc TestKotlinFirst.kt -include-runtime -d TestKotlinFirst.jar
- -d: 用来设置编译输出的名称,可以是 class 或 .jar 文件,也可以是目录。
- -include-runtime : 让 .jar 文件包含 Kotlin 运行库,从而可以直接运行。
关于包名
类的包名可以和物理包名不一致
复制package com.imooc.kotlin_first
com.imooc.kotlin_first.TestKotlinFirst.kt
导入其他类
复制import com.imooc.kotlin_first.Utility.multiply
import com.imooc.kotlin_first.Utility.multiply as mul
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)