相关文章推荐

第五讲 类定义与继承

面向对象开发,最重要的就是定义一个类。Java 的世界中存在很多类(内部类丶匿名内部类丶静态类丶枚举类等),Kotlin也存在这些类,只是在定义的有些许不同,并增加了一些特有的类(密封类 丶 data类等)。接下来让我们来看看这些类如何定义,以及其功能。

定义一个类

Java 类只能定义在一个与类同名的 .java 文件中(先不考虑内部类)。Kotlin 中你可以不这样做了。你可以在同一个 .kt 文件里定义多个类。

package com.qihoo.kot
class DemoClass
复制代码

Kotlin 定义一个类就是这么简单,但是这个类没有任何意义。需要注意的是:Ktolin 默认定义的类都是 public final 类型的(Kolin 也不使用这 2 个关键词了)。

我们都知道 Java 创建一个对象都需要调用其类的构造函数。Kotlin 也具有这个特点,只是构造函数的定义上存在一些区别。

主构造函数

Java 所有的类都会一个默认隐藏的无参构造函数。Kotlin 与之对应的函数,称之为 主构造函数 ,Kotlin 的主构造函数默认也是隐藏的,但是主构造函数可以定义参数的。

* 创建一个 Empty 类, 并且主构造函数有2个参数 class Empty (name: String, age: Int ) fun main () { * 调用构造函数,创建一个实例 val empty = Empty( "阿文" , 18 ) 复制代码

次构造函数

既然存在主构造函数,那么就会存在次构造函数。Kotlin 的次级构造函数,类似于 Java 的构造函数重载,不同的是 Kotlin 的次级构造函数,一定要与主构造函数关联。定义一个次级构造函数使用 constructor 定义方法即可。

* 创建一个 Empty 类, 并且主构造函数有2个参数 class Empty ( name : String , age : Int ) { * 定义次构造函数 * 由于我定义了主构造函数,所以必须要 使用 : this(XXX) 的形式调用下主构造函数 constructor ( name: String , age: Int, sex: String ) : this ( name, age ) { 复制代码

构造函数 init 方法

曾几何时,Java 中我们经常自定义 View,需要重写 N 个构造函数,然后每个函数都要调用 init 方法。做一些初始化画笔等功能。在 Kotlin 中 init 方法具有类似的功能,在调用构造函数之后会调用(有点类似构造代码块)。

class Empty(name: String, age: Int) {
    init {
        println("对象创建:$name  $age ")
     * 也可以定义多个 init 方法,执行顺序从上到下
    init {
        println("对象创建22:$name  $age")
复制代码

构造函数修饰符

还记得 Java 中单利吗?第一件事就是私有化无参的隐藏构造函数。Kotlin 对应的就是私有化主构造函数了。

* 构造方法权限符修饰 class DemoClass private constructor ( ){ * 也可以 私有化次构造函数 private constructor ( name: String , age: Int ) : this ( ) {

补充一个小点,不然后面的继承有点知识盲点。如果定义了次级构造函数且主构造函数没有明确指定(默认使用隐藏的主构造函数),那么次级构造函数无需做主构造函数的关联。

* Empty 类的主构造函数没有被重新定义 open class Empty { * 可以发现 次构造函数可以,省略不写 :this() constructor (name: String ) 复制代码

类函数

既然讲了如何通过定义构造函数定义了类,那么定义类的属性和函数是必不可少的了。其实定义的次构造函数也是函数(Kotlin 中的函数,会分一个大章节来详细讲解)。定义函数需要使用 fun 修饰符来修饰,默认定义的函数都是 public final

open class Empty {
     * 定义 call 函数,并定义行参 type
    fun call(type: Int) {
复制代码

类属性

还记得 Java 中,构造函数中为类的成员变量赋值的写法吗?

public class Empty {
    private final int name;
    private final int age;
    public Empty(String name, int age) {
        this.name = age;
        this.age = age;
复制代码

来看看 Kotlin 的简单写法!我们只需要在主构造函数中,使用 val var 修饰符修饰变量,对应的变量就会变成类的成员变量了(此功能只能使用在主构造函数中)。

open class Empty(val name: String, val age: Int)
复制代码

当然我们也可以定义其他的成员变量。

open class Empty(val name: String, val age: Int){
    val sex: String = "男"
复制代码

继承

前面说过 Kotlin 的默认定义的 class 是默认 final 类型的,也就是不可以继承。如果要继承必须使用 open 符修饰。Kotlin 中的继承不再像 Java 使用 extends 而是替换成了 :
* open 修饰 open class A (val name: String ) * B 继承 A 类,中间用 : class B (name: String ) : A(name) 复制代码

重写属性和方法

Java 的世界中,只存在重写方法。但是 Kotlin 是可以重写属性&重写方法,只需要用 override 修饰即可。

* open修饰 open class A { // value 记得 open open val value = 0 * B继承A类 class B : A () { // 覆盖A的 value 值,要用 override override val value = 1 复制代码

重写方法:

* B 继承 A 类 class B : A () { // 覆盖A的value值 override val value = 1 override fun test () { super .test() // 若要获取父类的属性 通过 super关键词 val superValue = super .value println( "父类的 $superValue " ) 复制代码

博客地址

Taonce
10小时前
私信
 
推荐文章