? 可空类型
申明属性testStr可以为空
val testStr : String? = null
?. 安全调用
实现 当testStr不为空时,输出其长度
//传统学法
val length = {
if (testStr != null) testStr.length
}
println("传统写法length=$length")
//?.写法
val length2 = testStr?.length
println("?.写法length=$length2")
!! 非空断言
//断言字符串一定不为空
testStr!!.length
如果字符串真的为null,那么程序会报空指针异常
Exception in thread "main" java.lang.NullPointerException
at com.example.mykotlin2.evils.KotlinKt.main(kotlin.kt:18)
at com.example.mykotlin2.evils.KotlinKt.main(kotlin.kt)
?: 空合并
如果字符真的为null,就输出 ?: 后面的信息
//?:写法
val info = testStr ?: "当前字符串未null"
println("?:写法info=$info")
//?. ?:经常联合使用
val length3 = testStr?.length?:-1
println("联合使用length=$length3")
as 类型转换
open class Person(var name:String,var age:Int)
class Student(name: String, age: Int):Person(name,age)
val person = Person("kotlin", 85)
val student = Student("java", 100)
val asPerson = student as Person
println("as类型转换:$asPerson")
val asStudent = person as Student
println("as类型转换:$asStudent")
as类型转换,如果是无法转换,报错类型转换异常
as类型转换:com.example.mykotlin2.evils.Student@3f99bd52
Exception in thread "main" java.lang.ClassCastException: com.example.mykotlin2.evils.Person cannot be cast to com.example.mykotlin2.evils.Student
at com.example.mykotlin2.evils.KotlinKt.main(kotlin.kt:38)
at com.example.mykotlin2.evils.KotlinKt.main(kotlin.kt)
as? 安全类型转换
val asPerson2 = student as? Person
println("as类型转换:$asPerson2")
val asStudent2 = person as? Student
println("as类型转换:$asStudent2")
as? 类型转换,如果是无法转换,会返回null,所以是安全的类型转换
as类型转换:com.example.mykotlin2.evils.Student@3f99bd52
as类型转换:null
: 继承或者实现
继承类
open class Person(var name:String,var age:Int)
class Student(name: String, age: Int):Person(name,age)
实现接口 Runnable
class Man:Runnable{
override fun run() {
}
}
:: 函数调用
表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法
fun add(x: Int, y: Int): String = (x + y).toString()
fun showInfo(x: Int,y: Int,info: (x1: Int, y1: Int) -> String): String {
return info(x,y)
}
调用
showInfo(1,2,::add)
listOf(1, 2, 3).forEach(::println)