Skip to content

Latest commit

 

History

History
152 lines (113 loc) · 6.01 KB

08.Kotlin构造函数.md

File metadata and controls

152 lines (113 loc) · 6.01 KB

目录介绍

  • 01.没有构造参数的类
  • 02.主构造函数
  • 03.次构造函数
  • 04.主构造函数之init方法

好消息

  • 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议或者问题,万事起于忽微,量变引起质变!

01.没有构造参数的类

  • 无构造函数
    class MainActivity{
    
    }
    

02.主构造函数

  • 在 Kotlin 中类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的类型参数)。
  • 主构造函数是类头的一部分,跟在类名(和可选的类型参数)后,主构造函数的参数可以是可变的(var)或只读的(val)
    class Point constructor(val x: Int, val y: Int) {
    
    }
    
  • 如果主构造函数没有任何注解或者可见性修饰符,可以省略 constructor 关键字
    class Point(val x: Int, val y: Int) {
    
    }
    
  • 如果构造函数有注解或可见性修饰符,则 constructor 关键字是必需的,并且这些修饰符在它前面
    class Point public @Inject constructor(val x: Int, val y: Int) {
    
    }
    

03.次构造函数

  • 类也可以声明包含前缀 constructor 的次构造函数
    • 如果类有一个主构造函数,每个次构造函数需要委托给主构造函数,可以直接委托或者委托到同一个类的另一个次构造函数以此进行间接委托,用 this 关键字来进行指定即可
    class Point(val x: Int, val y: Int) {
    
        private val localX = x + 1
        private val localY = y + 1
    
        init {
            println("initializer blocks , x value is: $x , y value is: $y")
            println("initializer blocks , localX value is: $localX , localY value is: $localY")
        }
    
        constructor(base: Int) : this(base + 1, base + 1) {
            println("constructor(base: Int)")
        }
    
        constructor(base: Long) : this(base.toInt()) {
            println("constructor(base: Long)")
        }
    
    }
    
    fun main(args: Array<String>) {
        Point(100)
        //initializer blocks , x value is: 101 , y value is: 101
        //initializer blocks , localX value is: 102 , localY value is: 102
        //constructor(base: Int)
        Point(100L)
        //initializer blocks , x value is: 101 , y value is: 101
        //initializer blocks , localX value is: 102 , localY value is: 102
        //constructor(base: Int)
        //constructor(base: Long)
    }
    
  • 初始化块中的代码实际上会成为主构造函数的一部分,委托给主构造函数会作为次构造函数的第一条语句,因此所有初始化块中的代码都会在次构造函数体之前执行
  • 即使该类没有主构造函数,这种委托仍会隐式发生,并且仍会执行初始化块。如果一个非抽象类没有声明任何(主或次)构造函数,会默认生成一个不带参数的主构造函数

04.主构造函数之init方法

  • 构造函数的函数体可以写在 init 块中
    • 主构造函数不能包含任何的代码,初始化的代码可以放到以 init 关键字作为前缀的初始化块(initializer blocks)中,初始化块包含了在类被创建时执行的代码,主构造函数的参数可以在初始化块中使用。如果需要的话,也可以在一个类中声明多个初始化语句块。
    • 此外,要创建一个类的实例不需要使用 Java 中的 new 关键字,像普通函数一样调用构造函数即可
    class Point(val x: Int, val y: Int) {
        init {
            println("initializer blocks , x value is: $x , y value is: $y")
        }
    }
    
    fun main(args: Array<String>) {
        Point(1, 2) // initializer blocks , x value is: 1 , y value is: 2
    }
    
  • 主构造函数的参数也可以在类体内声明的属性初始化器中使用
    class Point(val x: Int, val y: Int) {
        private val localX = x + 1
        private val localY = y + 1
        init {
            println("initializer blocks , x value is: $x , y value is: $y")
            println("initializer blocks , localX value is: $localX , localY value is: $localY")
        }
    }
    
    fun main(args: Array<String>) {
        Point(1, 2)
        //initializer blocks , x value is: 1 , y value is: 2
        //initializer blocks , localX value is: 2 , localY value is: 3
    }
    

关于其他内容介绍

01.关于博客汇总链接

02.关于我的博客