类
默认创建的类是final不可以被继承,若想要继承用open修饰。
open class Person {
val name:String
val age:Int
}
class Student(val grade:Int): Person(){
}
构造函数
创建类时必须给予构造器,无参数可省略()。
声明在类后面的称之为主构造器,声明在下面的次构造器必须继承主构造器。次构造器的参数永远多于主构造器。
Kotlin不需要使用new关键字,直接写:类()
定义函数
1.与Java定义函数的区别在于:Kotlin在定义函数的时候要加个fun关键词,函数的返回值前后不同,Java的在前面,kotlin在后面
2.如果一个函数只有一个并且是表达式函数体并且是返回类型自动推断的话,可以直接这样写
fun getResult(a: Int, b: Int) = a + b
3.如果函数返回一个无意义的值,相当于Java的void,则可以这样写
//无返回值
fun initView(){}
//返回Int
override fun getContentView(): Int {
return R.layout.activity_wan_android
}
属性
var
变量使用var关键字,var代表可变。
val
常量使用val关键字,val代表只读(val = var final)。
val是线程安全的,并且必须在定义时初始化,所以不需要担心 null 的问题 强烈推荐能用val的地方就用val。
/**
* 创建集合
*/
private var fragments = mutableListOf<Fragment>()
属性的类型在后面,变量名在前面,中间加冒号和空格。
val grade:Int 在构造器中声明的属性为全局属性。
private var index: Int = 0 //定义具体的类型
getter/setter
在Kotlin中创建一个属性,
- 如果是val,那么会自动生成getter方法,常量(赋值后不可变)
- 如果是var,那么会自动生成getter和setter方法。
对于属性有getter/setter方法,一般写在属性的后面
val height:Double = 1.70
set(value)={
feild = value
}
get()=feild
lazy
懒加载对象 lazy 委托属性、成员变量,可以用于只读属性的惰性加载。
懒初始化是指推迟一个变量的初始化时机,变量在使用的时候才去实例化,这样会更加的高效。
private val compositeDisposable: CompositeDisposable by lazy {
CompositeDisposable()
}
lateinit 延迟初始化属性
本身的含义是延迟初始化,但是在编译时必须保证 lateinit 修饰的参数被初始化,否则编译之后运行会报错。
慎用,因为防止后面没有进行初始化
private lateinit var adapter : AndroidCollectAdapter
关键字
object
为同时声明一个类及其实例
typealias
类型别名为现有类型提供替代名称
as
是一个中缀操作符,as是不安全的转换操作符,如果as转换失败,会抛出一个异常,这就是不安全的。
as?
as?与as类似,也是转换操作符,但是与as不同的是,as?是安全的,也就是可空的,可以避免抛出异常,在转换失败是会返回null
fun
表示声明一个函数
in
用于指定for循环中迭代的对象
!in
表示与in相反,用作中缀操作符以检查一个值不属于一个区间、一个集合或者其他定义contains方法的实体。
is和!is
是否符合给定类型,类似与Java的instanceOf,is操作符或其否定形式!is来检查对象是否符合给定类型
constructor
声明一个主构造函数或次构造函数
init
主构造函数不能包含任何的代码。初始化的代码可以放到以init关键字作为前缀的初始化块中:
where
用于指定泛型多个类型的上界约束
when
when表达式就相当于Java的switch表达式,省去了case和break,并且支持各种类型。控制流(Control Flow):Kotlin的控制流有if when for while
四种
when (position){
0 ->{
}
1 ->{
}
else -> {
// 默认,相当于switch中default
}
}
操作符
?:
如果 ?: 左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式。
注意:当且仅当左侧为空时,才会对右侧表达式求值。
val l = b?.length ?: -1
!!
这是为空指针爱好者准备的,非空断言运算符(!!)将任何值转换为非空类型,若该值为空则抛出异常
能不用!!操作符就不要用。。。
?.
使用 ?. 操作符,就先判空,如果不为空则赋值
?=
使用 ?= 操作符,当前面的值不为空取前面的值,否则取后面的值,这和java中三目运算符类似
伴随对象
我们需要一个类里面有一些静态的属性、常量或者函数,我们可以使用伴随对象。这个对象被这个类的所有对象所共享,就像java中的静态属性或者方法。在类声明内部可以用 companion 关键字标记对象声明。
companion object的好处是,外部类可以直接访问对象,不需要通过对象指针。伴随对象,对应java中类的静态成员。
companion object {
//定义常量
const val INTENT_TAG_HOME_DATA = "homeData"
//定义方法
fun lunch(context: Activity?) {
context?.startActivity(Intent(context, MainActivity::class.java))
}
}
注解
@JvmStatic
在Java中调用方法
/**
* 获取当前本地apk的版本
* 如果是在Java中调用该静态方法,则必须添加上@JvmStatic
*/
@JvmStatic
fun getVersionCode(mContext: Context): Int {
...
}
拓展函数
/**
* 拓展FragmentActivity的函数,此处duration已经赋了默认值,所以这个参数可传可不传。
*/
fun FragmentActivity.toast(message: CharSequence,duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
拓展属性
//扩展String类的属性
val String.lastChar: Char
get() = get(length - 1)