Skip to content

2019-11-04:谈谈kotlin中的构造方法?有哪些注意事项? #180

Open

Description

@Moosphan
No description provided.

Activity

  1. iOrchid commented on Nov 4, 2019

    @iOrchid

    一、概要简述

    1. kotlin中构造函数分为主构造和次级构造两类
    2. 使用关键词constructor标记构造函数,部分情况可省略
    3. init关键词用于初始化代码块,注意与构造函数的执行顺序,类成员的初始化顺序
    4. 继承,扩展时候的构造函数调用逻辑
    5. 特殊的类如data class、object/componain object、sealed class等构造函数情况与继承问题
    6. 构造函数中的形参声明情况

    二、详细说明

    • 主/次 构造函数

      1. kotlin中任何class(包括object/data class/sealed class)都有一个默认的无参构造函数
      2. 如果显式的声明了构造函数,默认的无参构造函数就失效了。
      3. 主构造函数写在class声明处,可以有访问权限修饰符private,public等,且可以省略constructor关键字。
      4. 若显式的在class内声明了次级构造函数,就需要委托调用主构造函数。
      5. 若在class内显式的声明处所有构造函数(也就是没有了所谓的默认主构造),这时候可以不用依次调用主构造函数。例如继承View实现自定义控件时,三四个构造函数同时显示声明。
    • init初始化代码块

      kotlin中若存在主构造函数,其不能有代码块执行,init起到类似作用,在类初始化时侯执行相关的代码块。

      1. init代码块优先于次级构造函数中的代码块执行。
      2. 即使在类的继承体系中,各自的init也是优先于构造函数执行。
      3. 在主构造函数中,形参加有var/val,那么就变成了成员属性的声明。这些属性声明是早于init代码块的。
    • 特殊类

      1. object/companion object是对象示例,作为单例类或者伴生对象,没有构造函数。

      2. data class要求必须有一个含有至少一个成员属性的主构造函数,其余方面和普通类相同。

      3. sealed class只是声明类似抽象类一般,可以有主构造函数,含参无参以及次级构造等。

  2. jingerlovexiaojie commented on Jul 27, 2020

    @jingerlovexiaojie
    1. Kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数。
    2. 如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字。
    3. 主构造函数初始化的代码可以放到以 init 关键字作为前缀的初始化块中。
  3. istudygithub commented on Aug 24, 2026

    @istudygithub

    Kotlin 中的构造函数主要分为主构造函数和次构造函数。主构造函数写在类头部,没有函数体,可以通过 val 或 var 直接把构造参数声明成成员属性;如果参数没有 val/var,它只是构造参数,不会成为成员属性。主构造函数还可以使用默认参数,因此很多情况下可以替代 Java 中大量的构造函数重载。

    如果初始化逻辑比较复杂,可以使用 init 代码块。属性初始化器和 init 块会按照它们在类中出现的顺序执行。

    次构造函数使用 constructor 声明。如果类存在主构造函数,次构造函数必须直接或间接通过 this(...) 委托给主构造函数。次构造函数自己的代码会在主构造函数及其初始化逻辑完成之后执行。

    另外需要注意继承时的构造顺序:创建子类对象时会先初始化父类,再初始化子类;父类构造函数需要通过 : Super(...) 显式调用。同时不要在父类构造函数或 init 中调用可以被子类 override 的 open 成员,否则可能访问到尚未初始化的子类状态。

    最后,Kotlin 创建对象不需要 new,构造函数默认是 public,如果希望限制实例创建,可以使用 private constructor。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions