在Kotlin中类的成员变量称为Property,如果是用var修饰,那么它相当于Java语言中的类成员属性Field+get()+set()。如果是val修饰,那么就是Field+get()。
类
// 类的定义
// 1.可见性默认为public,类内无内容可省略{}
class A // 这是一个类
// 2.类内成员必须初始化
class B{
var x = 100
}
// 3.构造器constructor
// Kotlin构造器可以有0或1个主构造器和0或n个副构造器。Kotlin类
// 至少有一个构造器,如果没声明构造器,那么就有默认的一个主构造器。
// 例子1:构造器写在类的内部时作为副构造器
class C{
constructor(x: Int){
}
}
// 例子2:构造器可以直接写在类名后,此时构造器是主构造器
class D constructor(x: Int)
// 此时可以直接省略constructor
class E(x: Int)
// 例子3:构造器上参数列表中的参数添加var或val修饰,相当于直接在类的内部声明了该成员
class F(var x: Int)
// 这个与上面的等价
// class F(x: Int){
// var x = x
// }
// 例子4:如果存在主构造器和副构造器,主构造器要求其它的构造器必须直接或者间接调用它
class G(x:Int){
constructor(x: Int, y: String):this(x) {
}
}
// 类的实例化
// 与Java类似,只不过没有new
抽象类
// 在class前加abstract即可
abstract class A{
// 抽象函数
abstract fun a()
// 普通函数:Java中普通方法默认可以覆写,在Kotlin中的普通函数
// 默认是 final 的,如果想要覆写,必须加上 open 关键字
// 无法覆写的函数
fun b(){}
// 可以覆写的函数
open fun c(){}
}
接口
// 与Java中类似
interface A{
fun a()
}
类的继承和接口的实现
// 在Java中,类的继承通过extends,接口的实现通过implements
// 在Kotlin中,都是通过:来进行继承类与实现接口的操作
// 接口实现
// 例子:
// 接口
interface A{
fun a()
}
// 类
class B: A{
// 覆写函数时必须加override关键字
override fun a(){}
}
// 类的继承
// 例子1:继承抽象类
abstract class C {
// 抽象函数
abstract fun c()
// 可以被覆写的函数
open fun d() {}
// 不可以覆写的函数
fun e() {}
}
// D继承抽象类C
class D : C() {
// 覆写抽象函数
override fun c() {
}
// 覆写用open修饰的普通函数
override fun d() {
super.d()
}
}
// 例子2:继承普通类
// 这是一个普通的类,如果要被继承,必须用 open 关键字修饰类
open class E {
open fun e() {}
fun f() {}
}
class F : E() {
override fun e() {
super.e()
}
}
// 例子3:A继承了一个类B,这个类B也继承了一个类C,并且C中有一个
// 函数可以重写,如果B不想A重写,可以添加 final
open class C {
open fun c() {}
}
open class B : C() {
final override fun c() {
super.c()
}
}
class A : B() {
// 无法覆写,除非B类中对函数c取消final修饰
// override fun c() {
// super.c()
// }
}
可空类型
Kotlin相比Java多了个可空类型,在Kotlin中,可空类型用?
来表示,比如说var string: String? = null
表示string可以为null。如果想要获取string的长度,由于string是可空的,所以可以使用安全访问:在变量名后加?
来访问:val length = string?.length
;如果可以确定该变量非空,也可以使用非空断言!!
将可空变量强转为非空类型来访问:val length = string!!.length
。不可将可空类型的值赋值给非空类型的变量,反之是可行的。