Kotlin-构造函数

本文介绍了Kotlin中构造函数的使用,包括无参和带参数的主构造函数,以及如何使用init进行初始化。次构造函数的定义和调用主构造函数的方式也进行了说明,并展示了构造函数的执行顺序,强调了在继承中的应用。
摘要由CSDN通过智能技术生成

kotlin 中的构造函数,主要分为 主构造函数次构造函数

  • 主构造函数没有函数体,只有一个
  • 次构造函数可以有多个,按顺序执行
  • 子类继承父类的构造函数,只能在父类的主构造函数和次构造函数中选一个,编译器会提醒子类换成主构造的形式继承。
1.主构造函数
//无参主构造函数
class ConstructorDemo constructor(){
    
}
//constructor 可以省略
class ConstructorDemo
//如果主构造函数是私有的,不能省略constructor
class ConstructorDemo private constructor()
//如果被注解修饰,不能省略
class ConstructorDemo @JvmOverloads constructor()
//带参数
class ConstructorDemo(val name: String)

带参数的反编译

public final class ConstructorDemo {
   @NotNull
   private final String name;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public ConstructorDemo(@NotNull String name) {
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.name = name;
   }
}

2.init

主构造函数没有函数体,如需要进行初始化操作可以使用 init,进行一些初始化的配置

class ConstructorDemo(var name: String){
    init {
        name = "Android"
    }
}

查看如何实现,相当于直接插入了代码到构造函数

   public ConstructorDemo(@NotNull String name) {
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.name = name;
      Log.d("TAG", "Constructor init");
   }
3.次构造函数

需要 constructor 关键字,参数不能和主构造函数一样

class ConstructorDemo(var name: String) {
    constructor(name: String, age: Int) : this(name){
        Log.d("TAG", "Sencond Constructor")
    }
}

反编译,调用了主构造函数,将相关代码放在之后

public ConstructorDemo(@NotNull String name) {
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.name = name;
      Log.d("TAG", "Constructor init");
 }

public ConstructorDemo(@NotNull String name, int age) {
      Intrinsics.checkNotNullParameter(name, "name");
      this(name);
      Log.d("TAG", "Sencond Constructor");
 }
4. 执行顺序
open class ConstructorFather(val str: String) {
    protected var mAge: Int = 0

    init {
        Log.d("tag", "Father init")
    }

    constructor(str: String, age: Int) : this(str) {
        Log.d("tag", "Father second constructor")
        mAge = age
    }
}
class ConstructorDemo : ConstructorFather {
    init {
        Log.d("TAG", "Child Constructor init")
    }

    constructor(str: String, age: Int) : super(str, age) {
        Log.d("TAG", "Child Sencond Constructor init")
    }
}

ConstructorDemo("Android", 14)

打印结果

Father init
Father second constructor
Child Constructor init
Child Sencond Constructor init

先父后子
先init后次构造

5.资料

Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值