1,kotlin语音
kotlin是JetBrains 创造出的一门基于 JVM 的语言。所以,kotlin代码经过编译变成java字节码,这样才能在JVM上运行。
2,基本数据类型
kotlin是一门完全面向对象的编程语言,万物皆对象,函数都是对象,也没有基本数据类型,都继承自Any这个类,kotlin对这些数据类型提供了以下内置类型
类型 | 字节数 | 实例因为是对象,所以数据类型相互转换需要使用专门的转换函数,如 toByte() toShort() toInt() toLong() toFloat() toDouble() toChar() |
Double | 64 | |
Float | 32 | |
Long | 64 | |
Int | 32 | |
Short | 16 | |
Byte | 8 |
3,var和val
var是一个可变变量,可以通过重新分配类更改另一个值的变量,和java的变量声明一致。
val是一个只读变量,类似于java的final变量,一旦创建,必须初始化,且以后不能被修改。
var name = "hello ,kotlin "
name="hello world ,kotlin "//√
val name = "hello"
name="hello java"//报错,不能再改了
4,修饰符作用域
public | 通java一致,全开放访问 |
private | 通java一致,只所在类可访问 |
protected | 通java一致,所在类及子类可访问,其他的不行 |
internal | kotlin独有,同module可访问,其他不行 |
5,空安全
通过定义非空类型实现在编译期减少空指针异常
var message:String="hello,kotlin"
message=null //编译出错
var message:String?="hello,kotlin"
message=null
print(message) //输出 null
同时,非空类型和可空类型不是同一个类型
var name1:String="kotlin" 非空类型
var name2:String?="kotlin" 可空类型
name1=name2 //编译出错
name1= name2.toString() //✓
name2=name1 //✓
name2=null
println(name2.length) //编译不过
println(name?.length) //为null则输出null,判断执行
println(name!!.length) //强制执行,为null则报空指针
6,Elvis操作符
var a = if( b !=null ) b.length else 0
var a = b?.length ?:0
上面语句是等价的,但更推荐使用第二种方式
其实就是三目运算符的省略版 如果b不为null,返回b.length,否则为0
7,类型推断
var a=null //a的类型为Nothing?
var name="name" //自动推断为String
if(name is String ){
print(name.length) //自动推断为String,可以使用String的各个方法
}
var name = null
var name2: String = name as String
print(name2) //直接崩溃
var name = null
var name2 : String? = name as? String
print(name2) //输入null
使用 is 关键字进行类型判断
使用 as 进行类型转换,可能会抛异常
使用 as? 进行安全的类型转换
8,if判断
if (表达式/lambda/方法) {
print("hello , kotlin ")
} else {
print("hello ,it is wrong ")
}
与java一样
9,for循环
var arr = arrayOf(1, 2, 3, 4, 6, 8, 9)
var list = arrayListOf(1, 2, 3, 4, 6, 8, 9)
println(arr.javaClass.simpleName) // Integer[] 整型数组
println(list.javaClass.simpleName)ArrayList 集合
for (i in arr) {
print(i)
}
println("")
for (i in list) {
print(i)
}
println()
var range1 = 1..3
var range2 = 1..10 step 2 //跨步 也就是间隔
println(range1.javaClass.simpleName)//IntRange 整数区间
for (i in 1..5) {// 1..5 双闭区间 必须前小后大 (1,2,3,4,5)
print(i)
}
println()
var range3 = 1 until 5
for (i in range3) {//前闭后开 必须前小后大 (1,2,3,4)
print(i)
}
println()
var range4 = 9 downTo 1 //前后闭区间 必须前大后小 ,也可以加入间隔step
println(range4.javaClass.simpleName)//IntProgression 序列
for (i in range4) {
print(i)//9 8 7 6 5 4 3 2 1
}
10,when关键字
var a=3
when(a){
1 -> println("a==1")
2 -> println("a==2")
3 -> println("a==3")
3 -> println("a==3")
5 -> println("a==5")
6 -> println("a==6")
}
//输出 a==3 找到匹配后执行并退出
11,while及do while
var a = 0
while (a != 10) {//和java的一样,boolean表达式即可,也可以用break跳出循环 continue跳出单次循环
println(a++)
}
//先执行一遍,再判断条件 和java一样,也可以用break跳出循环 continue跳出单次循环
var a = 0
do {
println(a++)
} while (a != 10)
三种结构化跳转表达式:
return。默认从最直接包围它的函数或者匿名函数返回。
break。终止最直接包围它的循环。
continue。继续下一次最直接包围它的循环。
12,函数
//无参无返回 返回其实是Unit
fun test() {
}
//有参无返回值
fun test(a: Int) {
print("test a")
}
//有参且带默认值
fun test(a: Int, b: Int = 10) {
print("test a b")
}
说明:当调用test(2)时,调用的是test(a: Int),这样就让带默认值的方法中的默认值无效了
//带个返回值
fun testhello(): String {
return "hello"
}
//lamdba表达式
fun testLamdba(a: Int) = a + 1