美文网首页
2. Kotlin---类和对象

2. Kotlin---类和对象

作者: 努力生活的西鱼 | 来源:发表于2019-10-26 10:04 被阅读0次
Kotlin

类定义

Kotlin使用关键字class声明类

class Person {
}

如果一个类没有类体,可以省略花括号。

class Person

主构造函数

一个类可以有一个主构造函数,一个或多个次构造函数。

class Person constructor(firstName:String){
}

如果主构造函数没有任何注解或者可见性修饰符,可以省略这个constructor关键字。

class Person (firstName:String){

}

主构造函数不能包含任何的代码。初始化的代码可以放到init作为前缀的初始化块中。

注意:主构造函数的参数可以在初始化块中使用,也可以在类体内声明的属性初始化器中使用。

class Person (firstName:String){

    init {
        println("FirstName is $firstName");
    }

    var name: String = firstName;

}

次构造函数

类也可以声明前缀为constructor的次级构造函数

class Person {

    constructor(parent:Person) {
        parent.childen.add(this);
    }

}

如果类有主构造函数,每个次构造函数都需要直接或间接地委托给主构造函数。委托到同一个类的另一个构造函数用this关键字。

class Person(val name: String) {
    constructor (name: String, age:Int) : this(name) {
        // 初始化...
    }
}

注意:初始化代码块中的代码实际上会成为主构造函数的一部分。委托给主构造函数会作为次级构造函数的第一条语句,因此所有初始化代码块中的代码都会在次构造函数体之前执行。即使该类没有主构造函数,这种委托也会隐式发生,并且仍会执行初始化块。

class Person (firstName: String){

    init {
        println("FirstName is $firstName");
    }

    constructor(firstName: String,lastName: String) : this(firstName) {
        println("firstName is $firstName,lastName is $lastName");
    }

}

val person = Person("W","M");

output:
FirstName is W
firstName is W,lastName is M

如果一个非抽象类没有声明任何构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是public的。如果你不希望类的构造函数是public,你需要声明一个带有非默认可见性的空的构造函数。

class Person private constructor(){

}

继承

Kotlin中所有的类都有一个共同的超类Any

将超类型放到冒号之后

class MeiZi (xingGe:String,zhangXiang:String,shengYin:String):Presons(xingGe,zhangXiang,shengYin){

}

class ShuaiGe (xingGe:String,zhangXiang:String,shengYin:String):Presons(xingGe,zhangXiang,shengYin) {

}

open class Presons constructor(var xingGe:String,var zhangXiang:String,var shengYin:String){

    init {
        println("New 了一个${this.javaClass.simpleName}, ta性格: $xingGe,长相: $zhangXiang,声音: $shengYin");
    }

}

如果派生类有一个主构造函数,其基类型必须用基类的主构造函数参数就地初始化。

如果派生类没有主构造函数,那么每个次构造函数,必须使用super关键字初始化其基类型,或委托给另一个构造函数做到这一点。

注意:在这种情况下,不同的次构造函数可以调用基类型的不同的构造函数。

class MyView : View {
    constructor(ctx: Context) : super(ctx)
    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
}

覆盖方法

如果父类中的方法没有标注open,则子类中不允许定义相同签名的函数

子类重写父类的方法,子类方法的前面必须加上override关键字

标记为override的成员本身就是开放的,也就是说,它可以在子类中覆盖。如果你想禁止再次覆盖,使用final关键字

open class Shape {

    open fun draw(){};

    fun fill(){};

}

class Circle : Shape(){

    override fun draw(){};

}

class Rectangle : Shape() {

    final override fun draw() {}

}

覆盖属性

属性覆盖和方法覆盖类似,在父类中声明然后在派生类中重新声明的属性必须override开头,并且它们必须具有兼容的类型

open class Shape {

   open val vertexCount:Int = 0;

}

class Circle : Shape(){

    override val vertexCount:Int = 8;

}

你可以用一个var属性覆盖一个val属性,但反之则不行。因为一个val属性本质上声明了一个get方法,而将其覆盖为var只是在子类中额外声明一个set方法。

派生类初始化顺序

在构造派生类的新实例的过程中,第一步完成其基类的初始化,因此发生在派生类的初始化运行逻辑之前。

设计一个基类时,应该避免在构造函数,属性初始化器以及init块中使用open成员。

调用超类实现

派生类中的代码可以使用super关键字调用其父类的函数与属性。

在一个内部类中访问外部类的父类,可以通过由外部类名限定的super关键字来实现。
super@Outer

覆盖规则

如果一个类从它的直接超类继承相同成员的多个实现,它必须覆盖这个成员,并提供自己的实现。为了表示采用从哪个父类型继承的实现,使用由尖括号中父类型名限定的super,如super<Base>

open class Rectangle {
    open fun draw() { /* …… */ }
}

interface Polygon {
    fun draw() { /* …… */ } // 接⼝成员默认就是“open”的
}

class Square() : Rectangle(), Polygon {
    // 编译器要求覆盖 draw():
    override fun draw() {
        super<Rectangle>.draw() // 调⽤ Rectangle.draw()
        super<Polygon>.draw() // 调⽤ Polygon.draw()
    }
}

相关文章

  • 2. Kotlin---类和对象

    类定义 Kotlin使用关键字class声明类 如果一个类没有类体,可以省略花括号。 主构造函数 一个类可以有一个...

  • oc总结

    一、类和对象 1.类是具有相同特征和行为的事物的抽象,对象是类的具体化,类是对象的类型。 2.类和对象是面向对象编...

  • day 15课堂总结

    01-认识类和对象 1.什么是类,什么是对象 2.类的声明 3.对象的声明 02-对象方法 1.类中的方法 2.对...

  • day14_python_类和对象

    1.类和对象定义: 类:就是拥有相同功能和相同属性的对象的集合(类是抽象)对象:类的实例(对象是具体的)2.类的申...

  • recode

    1.生成式和生成器 2.面向对象类和对象类:拥有相同属性和功能的对象的集合(抽象的)对象:类的实例(具体的) 类的...

  • Java基础 面向对象入门基础知识 个人学习总结

    类和对象基础知识 1.类和对象的定义 2.如何定义java中的类 3.java对象 1.创建对象:对类进行实例化 ...

  • Day16面向对象2

    类和对象 1.类的声明 class 类名:类的内容 2.属性 - 声明在类中的变量 a.对象属性 - 值会因为对象...

  • 类和对象

    recode1. 1.类和对象的概念 类:拥有相同属性和相同功能的对象的集合 对象:类的实例 2.类的声明 cla...

  • OC回顾

    一、类和对象 1.定义:类是具有相同特征和行为的事物的抽象,对象是类的具体化,类是对象的类型。 2.面向对象的三大...

  • 面向对象2

    生成式和生成器 1.生成式和生成器 2.面向对象类和对象类:拥有相同属性和功能的对象的集合(抽象的)对象:类的实例...

网友评论

      本文标题:2. Kotlin---类和对象

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