Kotlin关键字二——constructor和init

关键字一——var和val中最后提到了构造函数,这里就学习下构造函数相关的关键字: constructor和init。

主要构造(primary constructor)

kotlin和java一样,在定义类时就自动生成了无参构造

// 会生成默认的无参构造函数
class Person{
   
}

与java不同的是,当kotlin的构造函数中必须带参数时,则需要在类名后面直接添加参数:

class Person(var name:String, var age:Int){
   
}

这种在类名后面添加参数(包含无参)的构造方法就称为主要构造(primary constructor)

次要构造(secondary constructor)

当类包含多个构造函数时,需要通过次要构造实现, 次要构造需要用constructor关键字修饰:

// primary constructor
class Person(var age: Int, var name: String) {
   
	// secondary constructor
    constructor(name: String) : this(18, name = name)
}

次要构造使用上需要注意:

  • 次要构造需要直接或间接调用主要构造
    // primary constructor
    class Person(var age: Int, var name: String) {
         
    	// 会提示: Primary constructor call expected
        constructor(name: String)
    }
    
  • 次要构造中不能声明类的属性,即不能使用var或val
    class Person(var age: Int, var name: String) {
         
        constructor(name: String) : this(age = 18, name)
        
    	// 提示'var' on secondary constructor parameter is not allowed
        constructor(var address:String, name: String):this(name)
    }
    

init

kotlin提供了一个方法init,当有多个构造方法,无论使用哪个构造方法都会调用到init方法:

// 调用 Person("xiao ming")或者 Person(16, "小明")后 都会输出
// I am a person
class Person(var age: Int, var name: String) {
   
    constructor(name: String) : this(age = 18, name)
    
    init {
   
        System.out.println("I am a person")
    }
}

可以看下实现原理:

public final class Person {
   
   public Person(int age, @NotNull String name) {
   
      super();
      this.age = age;
      this.name = name;
      // init方法
      System.out.println("I am a person");
   }

   public Person(@NotNull String name) {
   
      this(18, name);
   }
}

可以看到kotlin构造的执行顺序是
主构造——>init()——>次要构造

相关推荐

  1. Kotlin关键字——constructorinit

    2023-12-09 23:08:02       45 阅读
  2. Kotlin by关键字

    2023-12-09 23:08:02       21 阅读
  3. Kotlin 特色 sealed 关键字

    2023-12-09 23:08:02       9 阅读
  4. Kotlin非常用关键字使用记录

    2023-12-09 23:08:02       24 阅读
  5. Kotlin关键字三——fun与方法

    2023-12-09 23:08:02       13 阅读
  6. kotlin take drop

    2023-12-09 23:08:02       38 阅读
  7. kotlin chunked windowed

    2023-12-09 23:08:02       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-09 23:08:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-09 23:08:02       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-09 23:08:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-09 23:08:02       20 阅读

热门阅读

  1. python中星号(*)的作用

    2023-12-09 23:08:02       42 阅读
  2. F. Maximum White Subtree

    2023-12-09 23:08:02       33 阅读
  3. hive sql&spark 优化

    2023-12-09 23:08:02       40 阅读
  4. 数据结构——栈与栈排序

    2023-12-09 23:08:02       47 阅读
  5. 以太网接口物理DOWN排查

    2023-12-09 23:08:02       45 阅读
  6. Git 的基本概念和使用方式

    2023-12-09 23:08:02       39 阅读
  7. 设计原则 | 里式替换原则

    2023-12-09 23:08:02       38 阅读
  8. 第10节:Vue3 论点

    2023-12-09 23:08:02       38 阅读
  9. C++中的string容器的substr()函数

    2023-12-09 23:08:02       36 阅读
  10. mysql语句练习

    2023-12-09 23:08:02       28 阅读
  11. Android Canvas 改变背景颜色

    2023-12-09 23:08:02       39 阅读