内部类
1.kotlin默认的内部类是静态内部类,不能持有外部类的状态(属性、方法等)
2.给内部类加上inner关键词之后,就会变成非静态内部类,可以访问外部类的属性和方法
3.非静态内部类想访问外部类的属性,可以使用 this@外部类名.外部类属性名 的形式访问
4.非静态内部类可以访问到外部静态内部类的方法和属性,静态内部类访问不到外部所有的属性和方法
class Outer { //外部类
private val text: String = "I like this world"
class Inner { //静态内部类
private val text: String = "NEW"
fun show() {
// println(this@Outer.text) //此处访问不到
println(this.text) //访问Inner中的text
}
}
inner class Inner2 { //非静态内部类
private val text: String = "Great"
fun show2() {
println(this.text) //访问Inner2中的text
println(this@Outer.text) //此处的写法相当于java中的Outer.this.text
}
}
}
fun main(args: Array<String>) {
val inner = Outer.Inner() //静态内部类
val inner2 = Outer().Inner2() //非静态内部类
inner.show()
inner2.show2()
}
在Kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化父类型或通过其他secondary构造方法完成这个任务,不同的secondary构造方法可以调用父类型不同的构造方法。
在kotlin中,类中的方法也是final类型,是不能被重写的,也需在方法前面加上open关键字后才可以;子类要重写父类中open修饰的方法,需在子类的方法前面加override关键字。如下所示:
若在父类中方法override前再加上final后,子类中的该方法是不能被重写的,否则编译器会报错。如下所示:
类前面加open与方法和属性(成员变量)open作用是不一样的,类前加open关键字表示类可以被继承,方法和属性前加open关键字表示方法和属性可以被重写。如下所示:
val与var修饰的属性或成员变量的重写的不同之处:
- val属性是可以被val的属性所override的;
- var属性是可以被val属性override的;
- val属性是不能被var属性所override的。
- 本质上val相当于get方法,var相当于set与get方法
var
var定义的【变量private】,但带有public的set和get属性:
val
val定义的【常量private】,带有public的get方法
const val
const val定义的【常量 】
其他
const 必须修饰val const 只允许在top-level级别和object中声明
//top-level
const val name = "Kotlin"
//object中
class DemoConstant {
companion object {
const val subName = ""
}
}
所谓的top-level就是位于代码文件的最外部,比如常见的类(非内部类和嵌套类)就是在top-level。意思是在结构上常量不属于任何的类,而是属于文件。
object中可以指的是最外部的object也可以指的是companion object.
从字节码我们可以看到const val 和val修饰对象的主要区别是:
const val 可见性为public final static,可以直接访问。
val 可见性为private final static,并且val 会生成方法getNormalObject(),通过方法调用访问。
当定义常量时,出于效率考虑,我们应该使用const val方式,避免频繁函数调用。