Kotlin类和对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012359498/article/details/84581996

“用Kotlin开发android更简洁( ̄_, ̄ )”

官方文档

翻译文档

类和继承

类的申明

和java一样可以用这种方式

class Empty {
    
}

//kotlin提供了一种更为简洁的方式创建无实体类型
class Empty

构造函数

在 Kotlin 中类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的参数)。

class Empty constructor(name: String) {
    
}
//如果想创建无参构造函数,都必须给它指定初始值
class Empty constructor(name: String = "") {
    
}

constructor 这个关键字官方是这样解释的

Here the constructor is private. By default, all constructors are public, which effectively amounts to them being visible everywhere where the class is visible (i.e. a constructor of an internal class is only visible within the same module).
这里的构造函数是私有的。默认情况下,所有的构造函数都是公开的,有效的,它们可以在任何地方都可见(即一个内部类的构造函数在同一个模块中可见)。

如果主构造函数没有注解或可见性说明,则 constructor 关键字是可以省略:

主构造函数不能包含任何代码,必须在init方法里

class Empty constructor(name: String) {

    init {
        Log.d(this.javaClass.name, "name =$name")
    }
}

二级构造函数

//如果构造函数没有参数

class Empty {
    constructor(empty: Empty) {
    }
}

//如果类有主构造函数,每个二级构造函数都要,或直接或间接通过另一个二级构造函数代理主构造函数。
//在同一个类中代理另一个构造函数使用 this 关键字:

class Empty(name: String) {


    init {
        Log.d(this.javaClass.name, "name =$name")
    }

    constructor(name: String, empty: Empty) : this(name) {

    }

}

类的创建

Kotlin 没有new

var empty = Empty("A")
var empty = Empty()//无参则需要在构造函数中指明初始值

继承

在Kotin 中所有的类都有共同的父类Any ,Any 不是 java.lang.Object,事实上它除了 equals(),hashCode()以及toString()外没有任何成员了

//类名 :父类,再加上构造函数的参数,可惜插件不太方便自动生成构造函数,希望能够改进

class KotlinTextView : TextView {
    constructor(ctx: Context) : super(ctx) {//super 和 java里面的概念一样
    }

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

复写成员

想要能够复写父类方法,都必须明确的注解出来

open class Empty(name: String = "") {//父类需要声明open关键字


    init {
        Log.d(this.javaClass.name, "name =$name")
    }

    constructor(name: String, empty: Empty) : this(name) {

    }

    open fun hello() {//方法也必须声明open

    }

    class NewEmpty() : Empty() {
        override fun hello() {//复写的话需要和java一样有override关键字,两个open缺一不可
            super.hello()
        }
    }
}

如果不想被重写则可以加上final

 open class NewEmpty() : Empty() {
        final override fun hello() {//加上了final关键字
            super.hello()
        }
    }

    class NewE() : NewEmpty() {
        override fun hello() {//此时编译器会提示错误
            super.hello()
        }
    }

复写规则

在 kotlin 中,实现继承通常遵循如下规则:如果一个类从它的直接父类继承了同一个成员的多个实现,那么它必须复写这个成员并且提供自己的实现(或许只是直接用了继承来的实现)。

  interface SayHello {
        fun hello() {
            Log.d("SayHello", "SayHello!!!!!!")
        }
    }

    open class NewEmpty() : Empty(), SayHello {
        final override fun hello() {
            super<Empty>.hello()    //可以选择性的用谁的父类方法
            super<SayHello>.hello()//为表示使用父类中提供的方法我们用 super<class>表示
        }
    }

抽象类

一个类或一些成员可能被声明成 abstract 。一个抽象方法在它的类中没有实现方法。因此当子类继承抽象成员时,它并不算一个实现:

abstract class I_Say {
    abstract fun hello() //抽象类定义不能作为实现,而接口(interface )可以
}

class Chinese() : I_Say() {
    override fun hello() {
        Log.d("SampleActivity2", "你好")
    }
}

class English() : I_Say() {
    override fun hello() {
        Log.d("SampleActivity2", "hello")
    }

猜你喜欢

转载自blog.csdn.net/u012359498/article/details/84581996