一切都需要从基础学起!
前言:
在Kotlin语言中,没有分号的概念了,也就是每一行代码,都不在需要用分号结束了
定义
常量:val --相当于java当中的final
变量:var
关键字:如枚举关键字enum,在 ‘enum class 类名’ 中,enum是关键字,但是如果 ‘val enum = 1’中,enum就不是关键字了
类型:以冒号:隔开在后面,也可以省略直接赋值,类型后带问号?
表示可为空类型(默认空安全)
是否为null参数定义:如x: String?表示x变量是String类型,且该变量可以为null
数据打印:${x},其中x为要打印的变量,如
//顶层变量:只有var、val声明方式,如果没有指定变量的类型时,
// 在编译时由编译器自动根据赋予这个变量的值来推断这个变量的类型
val i = "1" //相当于java中 final ,值不可以更改的
var j = 2 //变量
var z: String = "这是一个String类型数据"
println("i = ${i},j = ${j},z = ${z},z.length = ${z.length}")
输出结果:
i = 1,j = 2,z = 这是一个String类型数据,z.length = 14
函数:
//顶层函数,类似java的main函数,其实也就是java的main函数,程序的入口(AS中输入main可自动补全)
fun main(args: Array<String>) {
println("这个是Kotlin的main函数")
}
PS:默认作用域是public
右键该文件运行,如同java文件启动main一样
//自定义函数
fun test(): String { return "这个是Kotlin函数的return内容" }
PS:在函数形参后面通过 :数据类型,如 : String 指定返回类型,如果没有声明返回的类型,那么默认类型是:Unit,
fun test1() = "声明函数后直接返回相应结果"
PS:可以声明一个函数并直接返回结果
fun test2(x: Int, y: String){
println("x = ${x},y = ${y}")
}
PS:声明指定函数接收的参数
fun test3(x: Int, y: Int) = if (x > y) {
x
} else {
y
}
PS:可以把函数主体换成表达式主体,把if当做是有返回值的表达式,在该函数被调用时,就会执行该if表达式并返回结果,并且这种 = if 的表达式可以使函数忽略返回类型
fun main(args: Array<String>) {
println("这个是Kotlin的main函数")
println(test())
println(test1())
test2(7, "这个是函数参数")
println("返回结果:${test3(2, 4)}")
}
输出结果:
这个是Kotlin的main函数
这个是Kotlin函数的return内容
声明函数后直接返回相应结果
x = 7,y = 这个是函数参数
返回结果:4
类定义
//简单的类定义
class Person { }
PS:与java不同的是Kotlin可以在类名后面加上(val name: String?),表示给类定义属性(给Person类创建了需要带参数类型的构造方法,并且表示该参数可以为null),代码如下:
class Person(val name: String?) {
}
PS:如果类不需要添加更多的方法,那么花括号{}也是可以不要的,
定义完整类如下:
class Person(var name: String?) {
//val 只有get获取器
val gender: String
get() = "男"
var stature: Int = 0
get() = field
set(value) {
field = value
}
var isMarried: Boolean = true
get() = field
set(isMarried) {
//field 就表示isMarried,需要给变量指定一个默认值
field = isMarried
}
}
PS:通过验证,获取器 只能这样写 get() = field ,否则会报如下异常(欢迎各位一起验证该获取器的写法,然后告知)
Exception in thread "main" java.lang.StackOverflowError
var person = Person("itsdf07")
person.stature = 177
println("name = ${person.name}, gender = ${person.gender}, stature = ${person.stature}, isMarried = ${person.isMarried}")
输出结果:
name = itsdf07, gender = 男, stature = 177, isMarried = true
枚举类
//enum 软关键字,为什么是软关键字?只有跟在class前面才是关键字,否则不是关键字
enum class Color(val r: Int, val g: Int, val b: Int) {
RED(255, 0, 0),
BLUE(0, 0, 255),
YELLOW(255, 255, 0)
}
控制流
when语句
fun test4() { //Kotlin中是没有switch关键字,而是使用when //when带参数 when (Color.BLUE) { //枚举常量 -> 相当于java中的case xxx: break; Color.RED -> println("红色") //如果枚举变量后面没有带 -> ,那么就类似java中的case没有写break Color.BLUE, Color.YELLOW -> println("蓝色或者黄色") } //when 不带参数,就可以在when里面写任意表达式,比如以下中类似java中的if(){...} else if(){...}写法 when { test3(2, 4) == 2 -> println("test3(2,4) = ${test3(2, 4)}") test3(2, 4) == 4 -> println("test3(2,4) = ${test3(2, 4)}") test3(2, 4) == 0 -> println("test3(2,4) = ${test3(2, 4)}") }
println("test5(2, 4) = ${test5(2, 4)}")
}
fun test5(x: Int, y: Int) = when {
x == y -> 0
else -> {
when {
x > y -> x
else -> y
}
}
}
调用test4()
输出结果:
蓝色或者黄色
test3(2,4) = 4
test5(2, 4) = 4
for循环,中断和继续标签
在Kotlin中任何表达式都可以用label{:.keyword } (标签)来标记。label的格式是被'@'标识符标记,例如:aso@, dfsu@都是有效的label:
如果有多重循环,带标签的break会跳转出标签所指示的那一个循环。带标签的continue会跳转到标签所指向的那个循环,进入该循环的下一次循环。
fun test6() {
//6次循环,打印出0、1、2、3、4、5
val rang: IntRange = 0..5
//简单的全部循环
for (i in rang) {
println("i = ${i}")
}
println("rang 0..5 全部循环完成了")
//循环过程中处理事件,如跳出 break
for (i in rang) {
println("i = ${i}")
if (i == 2) {
println("rang 0..5 跳出 i= ${i} 循环完成了")
break
}
}
//循环过程中处理事件,如跳过 continue
for (i in rang) {
if (i == 2) {
println("rang 0..5 跳过 i= ${i} 循环完成了")
continue
}
println("i = ${i}")
}
//Kotlin也是支持goto的
for (i in rang) {
aso@for (j in rang){//执行到i== 3的时候,跳出该次循环
if (i == 3) {
println("rang 0..5 跳过 i= ${i} 循环完成了")
break@aso
}
println("i = ${i}, j = ${j}")
}
}
}