Kotlin 学习笔记-01

来源:互联网 发布:制作ico图标的软件 编辑:程序博客网 时间:2024/06/05 02:36

原文地址:用Kotlin开发Android应用

1 类定义

class Personal(        var name: String,        var id: Int = 1,        var sex: String = "male")

格式:类名(构造参数…)
构造参数可以指定默认值,那么在初始化实例时,对应位置参数就可以不传值,方法也是,但这里要注意顺序的问题,如 id 不想传值,sex 想传值,这种情况的话似乎不行(就目前学到的关于 Kotlin 的知识来说)
初始化方式有以下几种:
val per = Personal(12)
val per1 = Personal(13,"lili")
val per2 = Personal(14,"tom","male")
另外构造参数同时可以作为该类的属性(域),可以直接操作:
per.name = "jack"
val id = per.id

2 字符串构造

使用 ${} 嵌入字符串中
System.out.println("person name is = ${per.name}")
如果对变量直接引用则只需使用 $ 后跟变量名即可

fun test(        var sex = "male"        System.out.println("person sex is = $sex"))

注意:
$sex紧接着就是字母、数字或下划线时仍需要使用 {}

3 空类型安全

3.1 使用 ? 显示指明对象可以为 null

此时要明确指定数据类型
var sex: String?
也只有这样,这个参数才能被赋为 null
var sex: String? = null
即不能为 null (没有 ? )的变量是不允许赋 null 的,从而避免遇到非预期的空指针异常

当变量可以为 null ,那么使用该变量的时候 Kotlin 就强制必须判断是否为 null

class MainActivity : AppCompatActivity() {    var mTextView:TextView? = null    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        initViews(null)    }    private fun initViews(view: View?) {        mTextView = findViewById(R.id.text_view) as TextView?        mTextView?.text = "i have change the text"    }}

注意这一句,如果不加 ?,编译是无法通过的。
mTextView?.text = "i have change the text"

3.2 确定不为 null 才使用,否则抛出异常

id!!.toString()
使用 !! 代表,表示使用的时候开发者断定此变量一定不会为 null 。但如果开发者错了,变量为 null,那么程序会抛运行时异常而立即终止,开发者需要承担程序终止的风险,所有没十足的把握就尽量不用吧。

3.3 如果为空就给一个值

 fun testNull(id: Int? = null) {        val caseNull = id?.toString()        val tr = caseNull ?: "144"    }

id 不为 null 才调用 toString 方法,id 为 null 则 id.toString 也为 null,此时caseNull 也会为 null,要使 caseNull 不为 null,就使用 ?: 为其指定一个值。
也可以简写为:val tr = id?.toString()?: "144"

4 扩展函数

可以为任何类添加新函数,只需在函数名前加上类名。在调用处,该函数将被导入到类中。

class Util {    fun Activity.toast(context: Context, message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {    Toast.makeText(context, "msg:$message", duration).show()}

可以在 Activity 中这样使用

fun test() {    val util = Util()    util.toast(this,"a test msg")}

但不能过度使用,应创建专门的委托类

5 函数式支持

fun test() {    val util = Util()    val tv = TextView(this)    tv.setOnClickListener {         var i = 12        util.toast(this,"click $i")    }}

6 when 关键字

fun test() {     var ii = 0        when (ii) {            0 -> println( "0:$ii")            in 1..10 -> println("1-10:$ii")            else -> println("$ii")        }}

in:在区间内(闭区间)
else:否则

7 open 关键字

一个类想被继承,必须标注为 open
一个方法想被覆写,父类方法上要加 open,子类覆写时要加 override

open class Util {    open fun getUtil(): Util {        return Util()    }}
class StringUtil : Util() {    override fun getUtil(): Util {        return StringUtil()    }}

8 Data class

Java 中我们会创建一些只用于保存数据的实体类

data class User(        var name: String,        var id: Int)

hashCode equals toString getter/setter 自动生成

9 其它知识点

  • 语句末可以(推荐)不使用 ; 号
  • 强类型语言:变量类型确定后就不能更改(不能强转)
  • var:一般类型
  • val:最终类型(只能赋值一次)
  • 使用 : 代替 java 中的 extends 关键字,所继承的类型同时要调用其构造方法
  • 类型和名称以另一种方式编写,用冒号分割。
  • 在Java中,我们可以用注释使我们的代码更清晰,但不是必须的。而Kotlin强制我们这么做。
  • 方法参数:类型和名称以另一种方式编写,用冒号分割。
  • 显示使用 override

END