Kotlin是纯粹的面向对象语言,类可以帮助我们很好的实现封装,创建各种各样的对象。
使用关键字class声明类,包含类名、类头和类体
我们继续盖房子,创建了一个House类:
class House public @Inject constructor(name : Int){
val myName :String = "Property--> my name is $name"
init {
println("This is init block, my house's name is $name")
}
constructor(param: Int) : this("Green House") {
println("This is second constructor!")
}
fun whoAmI(){
println("I am $myName")
}
}
上面是一个完整的类声明,类名(House),类头(public constructor(name : Int),类体(大括号括起来的部分)。
类体又包括属性(myName字段),init块,次构造函数(constructor定义)和方法(fun)
如果不委托的话会发生什么呢?
constructor(){
println("This is third constructor")
}
编译一下,会看到提示
Error:(12, 5) Kotlin: Primary constructor call expected
我们开始化繁为简,Kotlin在未声明可见性的情况下,默认为public(下文会讲可见性),于是public可以省略:
class House @Inject constructor(name : String){
/**do something*/
}
不是所有的类定义都需要注解,当这两个条件同时满足时,可以省略constructor:
class House (name : String){
/**do something*/
}
如果我们定义的类,不需要参数:
class House {
constructor(param: Int){
println("This is second constructor!")
}
}
这种时候,委托会隐式发生,当然,还是会执行init初始化块
Kotlin更神奇的地方是,可以没有类体:
class House
你没看错,这是一行合法的代码
这些构造函数,会在什么时机用到呢?——创建类的实例
Kotlin没有new 关键字,创建类的实例,跟调用方法写法是一样的:
var house = House()
val house2 = House(10)
Kotlin中定义属性使用var(可变)和val(不可变)
定义一个属性的完整字段包括:
var [: ] [= ]
[]
[]
下面是一个完整的property定义:
var myName :String? = "Property--> my name is Green House!"
get() = "My value has changed! field is $field"
set(value) {
if (value != null) {
field = value
}
}
Kotlin语言,访问属性比较简单,直接使用对象+属性名称访问(虽然用起来方便,但个人认为有点破坏封装,稍有不慎,所有内部的实现都会暴露在用户面前):
var house = House()
println(house.myName)
house.myName="I have changed to Red"
println(house.myName)
我们看一下运行结果:
可以看到,通过重写get()可以改变属性返回值,通过重写set()可以重新定义属性的赋值方式。
如果把var改成val属性会怎么样呢?
会出现编译错误,A ‘val’-property cannot have a setter,可以看到val变量是不允许有set函数的。
class House (val myName="Property--> my name is Green House!")
lateinit var subject: TestSubject
fun setup() {
subject = TestSubject()
}
类内部的成员函数,跟上一章节说的函数是完全一样的,在类的内部自然多了一些跟类相关的属性,比如open, override,Kotlin关于函数是否能被覆盖,以及覆盖父类的函数,都需要显示说明。详情我们会在类的覆盖和继承中讲解
open fun area(length: Int, width: Int): Int {
return length * width
}
返回目录