1.object 用于创建单例模式
object Resource {
val name = "Rocker"
}
2.lazy 、lateinit 用于延迟初始化,第一次使用时再实例化
val name: String by lazy {
"Rocker"
}
lateinit var name:String;
fun testName(){
name = "Rocker"
}
两者区别:
by lazy 修饰val的变量
lateinit 修饰var的变量,且变量是非空的类型
3.when 用于判断 相当于java中的switch()语句
fun getName(age: Int) = when (age) {
12 -> "jim"
18 -> "lili"
else -> "Rocker"
}
4.let 默认当前这个对象作为闭包的it参数,返回值是函数里面最后一行
fun testLet(){
"Rocker".let {
print(it)
print(it)
}
}
5.apply 调用对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象
fun testApply(){
mutableListOf<String>().apply {
add("jim")
add("lili")
add("Rocker")
}.add("To test whether returns this object")
}
6.with函数是一个单独的函数,返回是最后一行,可以直接调用对象的方法,感觉像是let和apply的结合。
fun testWith(){
with(mutableListOf<String>()){
this.add("jim")
add("lili")
add("Rocker")
this
}.add("To test whether returns this object")
}
7.open 与java 中的 final相反:它允许别的类继承这个类。默认情形下,kotlin 中所有的类都是 final ,用来表示他可以被继承。
-
修饰类:表示可以被继承
open class Base(p: Int) class Child(p: Int) : Base(p)
-
修饰成员 : 表示可以复写,在 kotlin 中坚持做明确的事
open class Base { open fun getName() {} fun getAge() {} } class Child() : Base() { override fun getName() {} }
注:abstract 抽象类或者方法默认是带着的open
8.companion object 伴随对象
在 kotlin 中不像 java ,它没有静态方法。在大多数情形下,建议只用包级别的函数。如果你要写一个没有实例类就可以调用的方法,但需要访问到类内部(比如说一个工厂方法),你可以在你的类中声明一个伴随对象,这样你就可以像 java那样把它当做静态方法调用。
interface TestCompanion {
companion object {
const val HOST = "http://www.baidu.com"
const val VERSION = "1.0"
}
}
9.is 类型检测及自动类型转换
使用 is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 做过类型判断以后,obj会被系统自动转换为String类型
return obj.length
}
//在这里还有一种方法,与Java中instanceof不同,使用!is
// if (obj !is String){
// // XXX
// }
// 这里的obj仍然是Any类型的引用
return null
}
或者
fun getStringLength(obj: Any): Int? {
if (obj !is String)
return null
// 在这个分支中, `obj` 的类型会被自动转换为 `String`
return obj.length
}
甚至还可以
fun getStringLength(obj: Any): Int? {
// 在 `&&` 运算符的右侧, `obj` 的类型会被自动转换为 `String`
if (obj is String && obj.length > 0)
return obj.length
return null
}
网友评论