Kotlin学习-类、类型安全和转换

228 阅读2分钟

一、类的定义

  • 类默认是public的
  • 如果类里面没有成员变量和成员方法,大括号可以省略
class SimpleClass
  • kotlin中的成员变量必须初始化(lateinit除外),其实跟java差不多
int valueInt = 0;
boolean valueBoolean = false;
Foo foo;    //不赋值对象也是null
var valueInt = 0
var valueBoolean = false
var foo: Foo? = null
  • 构造方法。分主构造器和副构造器。副构造器都会调用主构造器。
class Foo {

    var value: Int = 0

    //副构造器
    constructor(value: Int) {

    }

}
//主构造器
class Foo constructor(value: Int) {

    var value: Int = 0
    
}

//进一步简化主构造器写法
class Foo(value: Int) {

    var value: Int = 0

}

//再进一步简化成员变量参数的写法
class Foo(var value: Int) 

二、接口的定义

  • kotlin中实现接口用冒号
  • java中重写方法使用@Override注解只是起提示作用,不是必须的,可以删掉,但是kotlin中Override写在方法前面且不可删除。
@Override
public void onSuccess() {
}
override fun onSuccess() {
}
  • kotlin的接口中可以定义属性,但这个属性要么是抽象的,要么提供访问器的实现。实现类必须重写抽象属性。
interface Callback {
    //抽象属性
    var prop: String

    //提供访问器的实现,必须是val
    val prop2: String
        get() = "Hello World"

    //会报错(block body)
    val prop3: String
        get() {
            "Hello World"
        }
}

重写属性

override var prop: String
    get() = TODO("Not yet implemented")
    set(value) {
    }
  • kotlin接口中的方法可以有方法体。
  • 接口只能定义行为不能定义状态。

三、抽象类

  • 定义抽象类
abstract class Foo(var value: Int)
  • 默认情况下,Kotlin 类是最终(final)的——它们不能被继承。 要使一个类可继承,请用 open 关键字标记它:
open class Foo(var value: Int)
  • 覆盖属性
open class Shape {
    open val vertexCount: Int = 0
}

class Rectangle : Shape() {
    override val vertexCount = 4
}

四、空类型安全

  • 用问号?防止为null直接崩溃
  • 用问号冒号?:做为null时的返回值处理
  • 用双感叹号!!使对象强制不会空(谨慎使用)

五、智能类型转换

  • 比如常用的isas/as?等,只要符合定义的对象就可以调用对象的方法
if(student is Person){
    student.name   //kotlin中不需要as Person强转,在java中是需要的
}
  • 尽可能使用val声明不可变的引用,让程序执行更加清晰。
  • 尽可能减少函数对外部变量的访问,因为访问很多时候意味着修改,会让情况更加复杂。
  • 必要时创建局部变量指向外部变量,避免因为变化引起程序运行错误。

--个人学习笔记