Kotlin-类`好奇怪`的构造函数

209 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

在学习了swiftdart基础语言后,我就屁颠屁颠去学习kotlin语言.在基础语法上.三个语言基本上都差不多.当我看到的介绍的时候,突然觉得好奇怪的构造函数.下面我们一起来看一下吧.

类的定义

kotiln的类主要由构造函数函数属性对象声明等等组成的.基本上和dartswift是一样的

  • 也是使用class关键字声明.后面加上类名.以及{},就组成了kotlin中最基本的

    //这样我们就声明了一个Test类
    class Test {}
    
  • 空类

    在这里我们又发现了一个好玩的定义空类,说是实话在dartswift中是不支持的.到现在我还是不太清楚空类存在的意义是啥.

    class Test
    

具体中的属性啦,函数啦,不在本文章分享的内容中,后续我会好好的学习一下.好了,铺垫了这么多,终于要上主菜了.往下看

主构造函数

  • 含义

    kotlin类中必然有一个主构造函数或者大于或等于1个次的构造函数.
    如果一个类不写构造函数,那么就会有一个默认的主构造函数.即本身.

  • 组成

      [类名]+ [可选的参数]
    
  • 关键词

     `constructor`: 构造函数
    
  1. 默认构造函数

    // 这个就是最基本的`主构造函数`
    class Test constructor(){}
    // 由于没有参数可以简写成
    class Test {}
    
    

    从这里,的创建,还是中规中矩的,基本上和dartswift是一样的.

  2. 带参数构造函数

    • 普通参数

      // 只有一个参数
      class Test constrictor(name:String){}
      // 多个参数
      class Test constrictor(name:String,title:String...){}
      // 当然如果你的构造参数只是普通类型,并没有注解标记
      // 那么constrictor是可以省略的
      class Test(name:String){}
      
    • 注解标记

      class Test @Inject internal constrictor(name:String) {}
      

      当然,从上面的事例中,我们发现其实主构造方法并没有方法体.那么如果需要初始化数据,应该怎么执行呢.这一点其实不用担心,kotiln也是有init方法的.这一点我个人感觉,和swift是一样的.默认都有一个init方法.系统会在初始化的时候,自己调用.

      到这里我们就发现了不同,一般我们声明类,如果有参数.在swift是需要重写构造函数,但必须的{}里.而这里直接在{}外,即可定义,确实也是省事了.不错的想法.

  • 私有

    默认的构造函数都是对外公开的,你可以理解为你声明的.在哪里都可以引用.如果你不想被外界使用呢.

    class Test private constructor () {}
    

次构造函数

这个次构造函数反而和我们平时使用的构造函数差不多了,但是,必须要加前缀constrictor如下所示

  • 无参数
    class Test {
           constrictor() {}
    }
    
  • 有参数
    1. 主构造没有参数.次构造有参数

      class Test {
          constrictor(name:String){}
      }
      
    2. 主构造有参数,次构造也有

      如果主构造函数有参数,那么每个次构造函数都要代理主构造函数.如果是同类中使用this关键词.

      class Test(name:String){
             constrictor(title:String): this(title + name){}
      }
      

初始化执行顺序

那么主构造函数次构造函数以及init方法执行顺序是啥呢.

class Test(name:String) {
   init {
       println("init:$name")
   }
    constrictor(title:String): this(title + name){
        println("constrictor:$title")
    }
   
}

fun main() {
   Test("你","瞅啥")
}

执行结果,如下所示

init:你瞅啥
constrictor:瞅啥

通过测试,得到的执行顺序是主构造->init->次构造.