美文网首页
kotlin基础之四 类和对象

kotlin基础之四 类和对象

作者: 大鹏的鹏 | 来源:发表于2018-11-22 18:41 被阅读8次

一.类的定义.

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("子类实现")
    }
}

相关文章

网友评论

      本文标题:kotlin基础之四 类和对象

      本文链接:https://www.haomeiwen.com/subject/junlqqtx.html