趁着过年前这几天工作任务不多,赶紧熟悉下kotlin,学习资料是扔物线大神的 kotlin教程
算是直接总结知识点代码。
一.变量
1.变量声明,默认必须初始化
class Sample {
//默认声明变量必须初始化
//类型后边加?表示可空类型
var v: View? = null
var v1: String = "haha"
fun test() {
v.setBackgroundColor(Color.RED)//报错
v?.setBackgroundColor(Color.RED)//不为空才调用方法
v!!.setBackgroundColor(Color.RED)//主动声明v一定不为空,
}
}
2.可以延迟初始化
//延迟初始化————编辑器一开始不再检查是否空,需要合适位置主动初始化
lateinit var v2: View
3.类型推断,kotlin可以不用声明变量的类型,可以推断出类型,但是声明过后不能切换,不是动态语言
//类型推断——可以不用写变量类型
var name = "Jack" //可以主动推断是String类型
var name = 1 //出错
4.val(value)
和var (variable)
val是只读,变量只赋值一次,类似java
的final
,但有不同。
var可读可写
var message = "你好"
val age = 18
5.变量
的可见性,kotlin默认是public
的
二.函数
1.函数声明关键字fun
//冒号后跟返回值,空返回值(java中的void)使用Unit,kotlin可以不写
fun say(message: String): String {
return "说了一句:$message"
}
2.参数传递要区分是否是可空变量,代码中的参数,声明的是不可空变量,如果传入可空的变量就报错
//修改message为可空类型
// var message = "你好"
var message: String? = "你好"
//不可空参数,如果传入可空参数,则报错
fun say(message: String): String {
return "说了一句:$message"
}
调用
say(message)//报错
3.函数
的可见性,kotlin
默认也是public
,但复写的时候,即override
会特殊处理
4.属性的getter/setter
var name = "Jack"
get() {
return "I'm$field"//field就是自己
}
set(value) {
field = "rich $value"
}
三.类型
1.基本类型————数字、字符、布尔值、数组与字符串
var number: Int = 10//还有Double Float Long Short Byte
var char: Char = 'c'
var isFood: Boolean = true
var ages: IntArray = intArrayOf(1, 2, 3)//还有FloatArray DoubleArray CharArray,都属于kotlin 的 built-in函数
var str: String = "Lili"
2.装箱根据场合来确定
对于Int,尽量用不可空变量
,避免性能开销
var a: Int = 10 // 不可空类型,不用装箱 unbox
var b: Int? = 10 // 可空类型,需要装箱 box
var list: List<Int> = listOf(1, 2) // int 列表 需要装箱 box
不可空
或数组(IntArray、FloatArray等
)不用装箱
3.类
和对象
默认是public
,可省略不写,继承或者实现接口(如下的 Impl接口
) 用 :
连接
class KotlinTestActivity : AppCompatActivity(), Impl {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
println("hello world")
}
}
4.类
的构造函数constructor
和其他的函数fun
区分
5.Kotlin
里的 override
函数的可见性是继承自父类的
6.kotlin
里类
默认都是final
类型的不可被继承,可用open
关键字后就可被继承,但继承的类不是open的,即open不遗传到子类
,但override
是可以遗传到子类的,如果不需要遗传,可在override
的函数前加final
//添加open关键字后,该类可以被继承,注意继承后的类没有open属性
open class KotlinTestActivity : AppCompatActivity(), Impl {
//加final,关闭了 override 的遗传性
final override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
println("hello world")
}
}
7.实例化类
不需要new
关键字
var activity: Activity = NewActivity()
四.类型的判断和强转
有子类继承KotlinTestActivity
class SecondActivity : KotlinTestActivity() {
fun action() {}//子类特有的方法
}
在KotlinTestActivity
中实例化,用Activity
引用,多态调用子类方法
open class KotlinTestActivity : AppCompatActivity(), Impl {
final override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
println("hello world")
var secondActivity: Activity = SecondActivity()
secondActivity.action()//多态调用子类方法,报错
}
}
kotlin
中用is
关键字来代替java
的instanceof
,且不需要转换类型,可以直接调用
var secondActivity: Activity = SecondActivity()
if (secondActivity is SecondActivity) {//类型推断
secondActivity.action()
}
使用强制转换的话可以用as
关键字
var secondActivity: Activity = SecondActivity()
(secondActivity as SecondActivity).action()//强制转换成SecondActivity,如果类型转换错误会抛出异常
如果转换失败,会抛出异常,所以可以加非空判断
var secondActivity: Activity = SecondActivity()
(secondActivity as? SecondActivity)?.action()//如果强制转换成功,则调用,否则即为空,就不调用