类的定义:成员变量和 构造方法
成员变量必须有确定的值 ,可以在声明时赋值,也可以在构造方法中赋值。也可以 通过 lateinit 延迟初始化(依赖注入使用) 但是必须赋值 ,而不是像java 一样使用缺省的值。
构造方法与初始化:
- 主构造器跟在类名后面
- 主构造器 由于没有方法体 ,因此操作放在 init 块中
- 次构造器必须委托给主构造器,主构造器太牛逼了。
- 主构造器中定义的 属性最先初始化。
- 属性的初始化优先于 init 代码块 。
- init 代码块优先于 次构造器
class SimpleClass(var age :Int) {
var i:Int = age.also{
println(" 初始化顺序 ,i 属性初始化")
}
var name = "默认名称".also{
println(" 初始化顺序 ,name 属性初始化")
}
// 次构造器
constructor( name:String ,x:Int):this(x){
println(" 初始化顺序 ,次构造器方法执行 ")
this.i = x
println("初始化顺序 ,次构造器方法执行 name = $name")
}
init {
i= age*3
println("初始化顺序 ,init 代码块 执行 i= $i")
}
}
fun main(){
var simpleClass = SimpleClass("王二",30);
}
输出
初始化顺序 ,i 属性初始化
初始化顺序 ,name 属性初始化
初始化顺序 ,init 代码块 执行 i= 90
初始化顺序 ,次构造器方法执行
初始化顺序 ,次构造器方法执行 name = 王二
Kotlin 实现接口与 java 的区别
kotlin 使用 万能的: 代替了 implements 关键字
使用 override 关键字 代替 java 中的 @override 注解 。
Kotlin 的接口可以包含属性,和非抽象方法。
Kotlin open 关键字
kotlin 的 非抽象 类 和 非抽象方法 默认都是 final 属性的,如果想要开启继承和 覆写功能,需要添加open 关键字
类的属性
java 的成员变量叫 field 。Kotlin 的成员变量被叫做属性,他们的区别是 ,kotlin 会为filed 添加默认的get 和set 方法。 当然我们也可以通过 backing filed 自定义 get 和 set 。
// 锤子手机预约 * 3功能
var chuiziNum = 1000
get() {
return field
}
set(value){
field = value
}
Kotlin 内部类访问外部类
- 访问 外部类使用: this@外部类名称 。 代替了java 的 外部类类名.this 方式
- 访问外部类父类:super@外部类名称 。 居然不需要外部类父类的名称。。
class Outter:Top(){
var name = "外部类"
inner class Inner{
var name = "内部类"
fun printOuuter(){
println("内部类 访问外部类"+this@Outter.name)
println("内部类 访问外部类 的父类 ${super@Outter.topName}")
}
}
}
open class Top{
var topName = " top 类"
}
Kotlin 接口的属性
接口属性 不能拥有 幕后字段 。 即不能存储状态,只能定义行为来简化代码。