Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Moosphan opened this issue Nov 4, 2019 · 2 comments
Open
Labels

Comments

@Moosphan
Copy link
Owner

Moosphan commented Nov 4, 2019

No description provided.

@Moosphan Moosphan added the Kotlin label Nov 4, 2019
@iOrchid
Copy link

iOrchid commented Nov 4, 2019

一、概要简述

  1. kotlin中构造函数分为主构造次级构造两类
  2. 使用关键词constructor标记构造函数,部分情况可省略
  3. init关键词用于初始化代码块,注意与构造函数的执行顺序,类成员的初始化顺序
  4. 继承,扩展时候的构造函数调用逻辑
  5. 特殊的类如data classobject/componain objectsealed 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只是声明类似抽象类一般,可以有主构造函数,含参无参以及次级构造等。

@jingerlovexiaojie
Copy link

jingerlovexiaojie commented Jul 27, 2020

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants