类
关键字:Class
构造函数
- 主构造函数
- 次构造函数
主构造函数
只能有一个主构造函数,主构造函数为类头的一部分:在类名之后
class Person constructor(firstName: String) { ... }
主构造函数不能包含任何代码,初始化的代码可以放到以 init 关键字作为前缀的初始化块
class test(arg : Int){
init{
println("init Data,data is $arg")
}
}
- 若初始化代码块和属性赋值同时交叉出现,则按顺序执行
- 构造函数有注解或可见性修饰符,则 constructor 关键字是必需的
次构造函数
每个次构造函数都需要委托给主构造函数
class Person (name : String) {
var pName = name // 赋值
var area = "GD" // 初始化
// 次构造函数
constructor(name: String,area : String):this(name){
this.area = area
}
// 初始化代码块 是主构造函数的一部分,
//所有初始化块中的代码都会在次构造函数体之前执行
init {
println("Init Data,data is $name")
}
fun printName(){ //函数一
println("Name is $pName")
}
fun printArea(){ //函数二
println("Area is $area")
}
}
测试:
fun main(args:Array<String>){
var person = Person("long","GX")
var person2 = Person("integer")
println("***************************")
person.printName()
person.printArea()
println("***************************")
person2.printName()
person2.printArea()
println("***************************")
println("Get Area : ${person2.area}")
// var 默认实现了getter和 setter,直接调用/赋值
}
输出:
Init Data,data is long
Init Data,data is integer
***************************
Name is long
Area is GX
***************************
Name is integer
Area is GD
***************************
Get Area : GD
继承
kotlin中所有的类都有一个共同的超类 Any,但是Any不同于Object,他只有equals()、hashCode() 与 toString()
允许定义的类可以被继承:open关键字
open class Person (name : String) {
...
constructor(name: String,area : String):this(name){
this.area = area
printName()
}
}
class Student(var grade:Int,name :String,area:String) : Person(name,area) {
init {
println("Grade is $grade")
}
}
- kotlin 里面继承的关键字是“:”
- 构造函数里面的参数带了 var、val 即为全局变量
- 子类中的构造函数必须得调用父类中的构造函数< : Person(name,area) >
代表调用父类Person的一个次构造函数 - 没有主构造函数的时候,定义了次构造函数,次构造函数也需要调用父构造函数
class Student : Person {
constructor():super("zero","SZ"){}
constructor(area:String):super("zero",area){}
}
简单来说,:就是类似于extends;后面的括号在继承是调用了父类的构造函数,当没有主构造函数时,可以省略