1.var是kotlin保留字,用于声明变量,与之相对的是val,表明引用不可变,但可以改变对象的值。
2.kotlin用:(冒号)取代了implements和extends保留字。
3.范围使用:in,downTo,step,until
*in在。。。范围内,闭区间[1,5]
for (i in 1..5){
println("$i 在1-5内")
}
*until在。。。范围内,在开区间[1,5),不包含5
for (i in 1 until 5){
println(i)
}
*step设置步长,比如设置一个步长为2
for (i in 1..5 step 2){
println(i)
}
*downTo倒序
for (i in 5 downTo 1){
println(i)
}
4.类型检查&转换
*is判断一个对象与指定的类型是否一致
var a:Any="a"
if (a is String){
println("a是String类型")
}
*as类型转换
//强制类型转换
var any:Any="abc"
var str:String=any as String
//使用安全转换操作符as?可以在转换失败时返回null,避免了抛出异常
var str1=null
var str2=str1 as? String
5.相等性判断,==,===
// 设置一个类如下
data class User(var name: String, var age: Int)
// 设置值
var a = User("Czh", 22)
var b = User("Czh", 22)
var c = b
var d = a
// 对比两个对象的结构
if (c == d) {
println("a 和 b 结构相等")
} else {
println("a 和 b 结构不相等")
}
// 对比两个对象的的引用
if (c === d) {
println("a 和 b 引用相等")
} else {
println("a 和 b 引用不相等")
}
// 输出结果:
a 和 b 结构相等
a 和 b 引用不相等
6.空安全
/**
* 1. 可空类型与非空类型
* 在Kotlin中,有两种情况最可能导致出现NullPointerException
**/
// 情况1:显式调用 throw NullPointerException()
// 情况2:使用!! 操作符
// 说明:!!操作符将任何值转换为非空类型,若该值为空则抛出异常
var a = null
a!!
// 抛出KotlinNullPointerException
// 情况3:数据类型不能为null
// 在 Kotlin 中,类型系统区分一个引用可以容纳 null (可空引用) 和 不能容纳(非空引用)
// 如:String类型变量不能容纳null
// 若要允许为空,可声明一个变量为可空字符串:在字符串类型后面加一个问号?
对于String,则是写作:String?
var b: String? = "b"
b = null
/**
* 2. 安全调用操作符
* 作用:表示如果若不为null才继续调用
**/
b?.length
// 表示:若b不为null,才调用b.length
// 注:安全调用符还可以链式调用
a?.b?.c?.d
// 假设a不为null,才继续往下调用,以此类推
// 若该链式调用中任何一个属性为null,整个表达式都会返回null。
// 若只对非空值执行某个操作,可与let一起使用
a?.b?.let { println(it) }
7.延迟初始化
描述:在kotlin中,成员变量的值被严格限制为可空和非可空,其中非可空的变量值,要么在声明的时候进行初始化,要么通过延迟加载的方法进行初始化,一般来说,有两种方法进行延迟加载.
*lazy:通过lazy函数,在首次使用的时候初始化.
private val xxxxFragment by lazy {
XXXXFragment().apply {
arguments = Bundle().apply {
}
}
}
*lateinit:自己控制变量的初始化.
private lateinit var iv: ImageView
*两种方式的使用场景:by lazy修饰val的变量,lateinit修饰var的变量,且变量是非空的类型.
8.object
描述:定义一个类,并创建该类的实例.
*创建一个单例
object Singleton {
fun xxx() {
}
}
*通过object代替匿名内部类
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {}
});
*companion object:由于在kotlin中没有静态函数,所以在kotlin中可以使用companion object替代java中的static修饰.编译器会自动生成一个叫做companion的静态内部类.
在Java中调用伴生对象,可以使用User.Companion.isMale(1)
class User {
companion object {
const val DEFAULT_USER_AGE = 30
}
fun test(){}
}
// later, accessed like you would a static variable:
user.age = User.DEFAULT_USER_AGE