类
Kotlin使用class关键字声明类,类声明由类名、类头(指定其类型参数、主 构造函数等)和由大括号包围的类体组成。
类头和类体都是可选的,如果一个类没有类体大括号可省略
class NoBody
类的构造函数
一类可以有一个主构造函数和一个或多个次构造函数。主构造函数是类头的一部分:它跟在类名(和可选的类型参数)后
主构造函数不能包含任何代码块,可用init块初始化代码,并且可访问主构造函数的参数
class Person constructor(firstName: String) {
init {
println(firstName)
}
}
如果类头没有任何注解或者可见性修饰符,constructor关键字可省略
class Person2(firstName: String) {
init {
println(firstName)
}
}
如果构造函数有注解或可见性修饰符,这个constructor关键字是必需的,并且这些修饰符在它前面
class Person3 public constructor(firstName: String) {
init {
println(firstName)
}
}
次构造函数
类也可以声明次构造函数
class Animal {
constructor(name: String) {
println(name)
}
}
如果一个类有主构造函数,每个次构造函数都需要委托给主构造函数,可以直接委托或者通过其它次构造函数间接委托
使用this关键字直接委托给当前类的主构造函数
class Animal2(name: String) {
constructor(name: String, age: Int) : this(name) {
println(name + age)
}
init {
println(name)
}
}
如果一非抽象类没有任何主或者次构造函数,它会默认生成一个不带参的主构造函数
class Animal3 {}
等同于
class Animal3(){}
将构造函数用private修饰可以防止被创建类的实例
class DontCreate private constructor() {}
创建类的实例
类定义后,需要创建实例才能使用
fun main(args: Array<String>) {
//实例化,Kotlin类的实例化省去了new关键字
var person = Person("zhangsna")
var person1 = Animal3()
println(person)
println(person1)
//private修饰符修饰的构造方法不能实例化
//var dontCreate = DontCreate()
}
继承
Kotlin和Java一样都有隐式继承,Java中一个类如果没有显示的继承一个类默认继承Object
而Kotlin中默认继承Any
class Example //隐式继承Any
Any中只有 equals()、hashCode()和toString()三个方法。附Any类源码图
在Kotlin中所有的类默认为final类型,是不能够被继承的。如果该类需要被继承则必须加上open关键字否则该类编译成class后是一个final类
open class Base {
}
使用:符号实现继承,继承的父类必须初始化
class Car : Base() {
}
如果父类主构造函数有参数子类必须声明一个有参数的主构造函数初始化父类的构造函数
open class Device(name: String) {
init {
println(name)
}
}
class Phone(name: String) : Device(name) {
}
如果父类没有主构造函数,那么子类每个次构造函数都必须使用super关键字调初始化父类次构造函数
open class Device2 {
constructor(name: String) {
println(name)
}
constructor(type: Int, weight: Int) {
println("$type" + weight)
}
}
class Computor : Device2 {
constructor(name: String) : super(name)
constructor(type: Int, weight: Int) : super(type, weight)
}
覆盖方法和属性
Kotlin中需要overried关键字显示的覆盖成员
open class Father {
open var a: Int = 1
open fun say() {
println("father say")
}
}
class Son : Father() {
//必须加上overried关键字,覆盖父类成员
override var a: Int = 2
override fun say() {
println("son say")
}
}
抽象类和继承
使用abstract关键字定义抽象类
abstract class Abstract {
//定义抽象方法时,必能有方法体
abstract fun absFun()
}
class Sub : Abstract() {
//子类必须实现父类的抽象方法
override fun absFun() {
println("absFun of sub")
}
}
转载于:https://blog.51cto.com/codemcx/1979123