一.类的定义.
1.1类的声明.
Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。
Kotlin 中使用关键字 class 声明类,后面紧跟类名:
class Apple{ // 类名为 Apple
// 大括号内是类体构成
}
当类没有结构体的时候,大括号可以省略。例:
class Apple
1.2类的构造函数
kotlin有主构造函数和次构造函数之分,但是java中没有。
1.2.1 主构造函数
在 Kotlin 中的一个类可以有一个主构造函数和一个或多个次构造函数。主 构造函数是类头的一部分:它跟在类名(和可选的类型参数)后。
class Person constructor(name: String) {
}
如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字。
class Person(name: String) {
}
主构造函数不能包含任何的代码。初始化的代码可以放 到以 init 关键字作为前缀的初始化块(initializer blocks)中:
class Person(username: String, age: Int){
private val username: String
private var age: Int
init{
this.username = username
this.age = age
}
}
注意,主构造的参数可以在初始化块中使用。它们也可以在 类体内声明的属性初始化器中使用:
class Person(name: String) {
val customerName = name.toUpperCase()
}
事实上,声明属性以及从主构造函数初始化属性,Kotlin 有简洁的语法:
class Person(val firstName: String, val lastName: String, var age: Int) {
// ……
}
与普通属性一样,主构造函数中声明的属性可以是 可变的(var)或只读的(val)。
1.2.1 次构造函数
类也可以声明前缀有 constructor的次构造函数:
class Person {
constructor(name: String) {
println(name)
}
}
如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托。委托到同一个类的另一个构造函数 用 this 关键字即可:
class Person(val firstName: String) {
constructor(firstName: String, lastName: String) : this(firstName) {
}
}
如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的 不带参数的主构造函数。构造函数的可见性是 public。如果你不希望你的类 有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数(此时改类不能够实例化):
class Person private constructor () {
}
注意:在 JVM 上,如果主构造函数的所有的参数都有默认值,编译器会生成 一个额外的无参构造函数,它将使用默认值。
class Person(val customerName: String = "")
二.类的继承.
在 Kotlin 中所有类都有一个共同的超类 Any,这对于没有超类型声明的类是默认超类:
class Person // 从 Any 隐式继承
Any不是 java.lang.Object;尤其是,它除了 equals()、hashCode()和toString()外没有任何成员。
在kotlin中,类默认是final类型的,也就是不可继承的。如果需要继承,需要显式的将类声明为open.
open class Parent(p: Int)
class Child(p: Int) : Parent(p)
覆盖方法、属性、规则
覆盖方法:
//父类
open class Base{
open fun method(){}
}
//子类
class Example : Base() {
override fun method() {
super.method()
}
}
三.抽象类.
和Java一样,在kotlin中,抽象类用关键字abstract修饰,抽象类的成员可以在本类中提供实现,也可以不实现而交给子类去实现,不实现的成员必须用关键字abstract声明:
abstract class AbsBase{
abstract fun method()
}
在kotlin中,被继承的类需要用关键字open声明,表明该类可以被继承,但是抽象类或者抽象函数是不用 open 标注的,因为这不言而喻。但是如果子类要实现抽象类的非抽象函数,需要在抽象类中将其声明为open
abstract class AbsBase{
abstract fun method() // 如果子类要实现需声明为抽象
open fun method1(){//非抽象方法如果要类子类实现,需要声明为open
println("输出")
}
}
class Child : AbsBase() {
override fun method() {
//抽象类的实现
}
override fun method1() {
super.method1()
println("子类实现")
}
}
网友评论