Kotlin-类和继承

来源:互联网 发布:网络魔兽世界 编辑:程序博客网 时间:2024/05/29 12:35

创建类

创建一个类很简单,使用class关键字就可以, 如下

class Person{}

构造方法

在Kotlin中,构造方法有两种“类型”,第一是主要构造方法,第二就是次要构造方法,
1. 主要构造方法直接就跟在类名后面,使用关键字”constructor”即可

class Person constructor(){}

当然,如果主要构造方法没有注解或一些修饰符,也可以省略关键字constructor,

class Person(){}

==注意==,这里的主要构造方法中,是不可以有任何代码的,不可以有代码?那我们要初始化怎么办?难道不可以初始化?肯定不是,不过初始化,则需要在init关键字中,如下

class Person(){    init{        println("Person init place");    }}

以上说的构造方法都是没有constructor关键字,那么是不是在任何情况下都不需要了?肯定不是的,看以下代码:

class Person pubilc @Inject constructor(){    //...}
  • public,有修饰符
  • @Inject,注解

    1. 次要构造方法
      要声明次要构造方法的时候,还是需要constructor关键字
class Person{    constructor(parent:Person){        //...    }}

如果类中有主要构造方法,那么次要构造方法中也是需要调用主要构造方法,可以直接或间接调用,在这时候,可以使用this关键字来调用。

class Person(name: String) {    constructor(name: String, parent: Person) : this(name,11) {    }    constructor(name:String,age:Int):this(name){    }}

如果一个非抽象类中没有任何构造方法,那么Kotlin会自动生成一个无参的public构造方法,如果不使用默认构造方法,那么就必须要修改构造方法

创建类的实例

fun test(){    val p = Person("MK");    val p1 = Person("MK1",11);    val pChild=Person("MK2",p)    val app=App();}class Person(name: String) {    constructor(name: String, parent: Person) :        this(name, 11) {}    constructor(name: String, age: Int) :             this(name) {}}class App{}

类的成员

一个类可以包含以下内容:
- 构造方法和初始代码块
- 函数
- 属性
- 内部类
- 对象声明

继承

在 Kotlin中,所有类都是Any的子类,如果没有显示的继承一个类,默认都继承Any类,这和Java中的Object是一个道理,Any中同样也包含有三个函数:equals,hashCode,toString。如果我们要明显继承某个类,则可以像下面这样:

open class Parent(p:Int)class Children(p:Int):Parent(p)

如果父类有主要构造方法,那么子类一定要实现。在 Kotlin中,所有类默认是终结的,也就是不可继承的,open关键字标识,这个类是开放的,和Java的final关键字是相反的效果,

重写方法

在前面的继承中看到过,在Kotlin中,如果要继承,则要显式的表示才能继承,那么如果要重写方法,也是需要显式的标识

open class Base {    open fun v() {}    fun nv() {}}class Derived() : Base() {    override fun v() {}}

在Derived中要重写Base的v方法,那么就需要Base的v方法有open修饰,如果没有open关键字修饰,那么就重写不了。那如果v只能继承到Derived,在Derived的子类则不再给重写,我们要怎么办?这时候,我们可以用另外一个关键字final

class Derived() : Base() {   final override fun v() {}}

重写属性

重写属性和重写方法其实很类似,可以被重写的属性也是需要被open关键字修饰,重写属性的时候也是需要override关键字。
这里有一个很特殊的点,如果一个属性被修饰为val,但在子类中却可以重写为var,从val可以改var,从var改为val却不可以。

==重写规则==

在Kotlin中,实现和继承都要遵从以下规则:
- 如果一个类中,父类和实现的接口中有相同的成员名时,它必须要重写这个成员并提供自己的实现(或者直接使用继承),我们使用super关键字和尖括号来调用父类的方法,

open class Person(name: String) {    open val age = 11;    open var position = "Manager";    constructor(name: String, parent: Person) : this(name, 11) {    }    constructor(name: String, age: Int) : this(name) {    }    open fun testOverRide() {    }}open class App(name: String) : Person(name) {    final override fun testOverRide() {    }    override var age = 112;    open fun f() {        print("it is App f fun")    }}interface B {    fun f() {        print("interface is not abstract");    }}class Bpp(name: String) : B, App(name) {    override var position = "aads";    //编译器会强制要求重写    override fun f() {        super<App>.f()//选择1        //super<B>.f()//选择2    }}

在B和App中,各自的实现都有一种方法,但在Bpp中,因为有同名的方法存在,因此在Bpp中是必须要重写,换一种说法就是,在Bpp中也必须有f的实现,但它可以有两种选择实现,亦或者都不实现父类的,可自行实现,

原创粉丝点击