1.关键字:

constructor

关键字可以省略,但是如果构造函数有注解或可见性修饰符,则关键字不可省,如设置构造函数为私有

class Person private constructor(){lateinit var name: Stringvar age: Int = 0var parent: Person? = nullconstructor(name: String, age: Int, child: Person):this(){child.parent = thisthis.name = namethis.age =age}constructor(name: String, age: Int):this() {this.name = namethis.age =age}}

如果不存在次构造函数,默认存在一个开发的主构造函数,添加 private 修饰为私有构造函数

2.直接在跟在类名后面的是主构造函数,主构造函数constructor可以省略
3.主构造函数和次构造函数可以共存,但是如果存在主构造方法,那么次构造函数需要直接或者间接的委托主构造函数

class Person(name:String){var name: String = namevar age: Int = 0var parent: Person? = nullconstructor(name: String, age: Int, child: Person) :this(name,age){child.parent = thisthis.name = namethis.age =age}constructor(name: String, age: Int):this(name) {this.name = namethis.age =age}}

4.如果不存在主构造函数,多个次构造函数可以共存,且不用委托

class Person{var name: Stringvar age: Int var parent: Person? = nullconstructor(name: String, age: Int, child: Person){child.parent = thisthis.name = namethis.age =age}constructor(name: String, age: Int) {this.name = namethis.age =age}}

5.主构造函数中不能代码,但是Kotlin提供一个init初始代码块

//init代码块
class Person  constructor(){lateinit var name: Stringvar age: Int = 0var parent: Person? = nullinit {println("I am init")println("name = $name,age=$age,parent = $parent")}constructor(name: String, age: Int, child: Person):this(){child.parent = thisthis.name = namethis.age =age}constructor(name: String, age: Int):this() {this.name = namethis.age =age}}

注意

(1) 如果存在主构造函数,类的属性必须存在初始化值或者用延迟加载关键字lateinit。但是 lateinit只能修饰非Kotlin基础类型,如String等

(2)init初始块在优先执行(次构造函数之前执行),如果执行过程中延迟加载的变量没有赋值,会报异常

Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized

(3) lateinit只能用于类体的var属性,不能用于构造函数中
(4) lateinit不能用于拥有定制gettersetter方法的属性

6.主构造函数的多种表示法

//主构造函数 直接定义属性
class Person(var name: String, var age: Int) {}//主构造函数 只传递参数 函数体内赋值
class Person1(name: String, age: Int) {var name = nameval age = age
}

7.构造函数属性可以函数类型

////主构造函数 属性为函数类型
class Person( num1: Int,  num2: Int,operator:(Int,Int)->Int) {lateinit var name :Stringinit {println("operator = ${operator(num1,num2)}")}constructor(num1: Int, num2: Int):this(num1,num2,operator = {x,y->x+y}){}}

8.属性

(1) var 默认有一般的公开getter和setter属性,可以直接通过.进行赋值和取值;

(2) val 默认有一般的公开getter,可以直接通过.进行取值,没有setter方法;

(3)属性定制;

  • 订制为私有 private set , 没有 private get,如果想属性不被公开,直接在属性前面添加private
  • 在get 和 get中不可以使用属性,否则会造成循环引用,Kotlin使用幕后字段field解决无限循环问题,所有需要使用字段自身的地方用field代替
  • get 和set可以任意定制,定义其中一个的话,另一个则为默认
///主构造函数 属性getter 和setter
class Person(age: Int) {//重写get和set方法var name: String = ""get() = "My name is" + fieldset(value) {field = value}var age: Int = ageset(value) {field = valueif (value >= 18) {isAdult = true}}//   属性定制为私有var isAdult: Boolean = falseprivate setvar addAge: Int = 0get() {return field + 1}set(value) {field = valueage += value}constructor(age: Int, name: String) : this(age) {this.name = name}override fun toString(): String {return "name =$name,age=$age,isAdult = $isAdult,addAge = $addAge"}
}

9.编译期常量

关键字:const

只能修饰 val

特点:
- 只能位于顶层或者object的成员,不能修饰一般类成员
- 只能修饰原始数据类型和String
- 没有自定义getter方法
- 区别val 和const val :str1 在传递的过程中是引用str1,str2在传递的过程中是传递str2的值”Hello Kotlin”

Kotlin代码

package `object`val str1 = "Hello Kotlin"
const val  str2 = "Hello Kotlin"fun main(args: Array<String>) {var str3 = str1var str4 = str2
}

反编译成java代码

public final class ConstTestKt {@NotNullprivate static final String str1 = "Hello Kotlin";@NotNullpublic static final String str2 = "Hello Kotlin";@NotNullpublic static final String getStr1() {return str1;}public static final void main(@NotNull String[] args) {Intrinsics.checkParameterIsNotNull(args, "args");String str3 = str1;String str4 = "Hello Kotlin";}
}

Kotlin系列——构造函数精讲相关推荐

  1. (java)玩转算法系列-数据结构精讲[学习笔记](一)不要小瞧数组

    前言: 课程:玩转算法系列–数据结构精讲 更适合0算法基础入门到进阶(java版) 此处是个人学习笔记,用作回顾用途 不要小瞧数组 1.使用java中的数组 Main.java: public cla ...

  2. YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)

    写在前面:大家好!我是[AI 菌],算法工程师一枚,2021年博客之星Top12,公众号[AI 修炼之路]作者.专注于计算机视觉.深度学习.图像处理技术,热衷于分享AI.CV.DL.ML.OpenCV ...

  3. 视频教程-php进阶课程之swoole系列课程精讲(第一季)-PHP

    php进阶课程之swoole系列课程精讲(第一季) 多年一线互联网开发实战以及培训经验,对php开发,linux运维架构有丰富的经验,善于分析问题,解决问题. lampol ¥199.00 立即订阅 ...

  4. YOLO系列算法精讲:从yolov1至yolov4的进阶之路(呕心沥血2万字超全整理,建议收藏!)

    从刚开始接触YOLO到现在也已经有大半年时间了,中间也陆陆续续接触过其它网络.最近又抽时间研究了一下YOLOv4. 因此,趁此机会,将yolov1到yolov4进行一个全面的整理和总结,希望对即将入坑 ...

  5. YOLO系列算法精讲:从yolov1至yolov4的进阶之路

    参考资料: https://blog.csdn.net/wjinjie/article/details/107509243?utm_medium=distribute.pc_feed_blog_ran ...

  6. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  7. 【C++自我精讲】基础系列三 重载

    [C++自我精讲]基础系列三 重载 0 前言 分二部分:函数重载,操作符重载. 1 函数重载 函数重载:指在同一名字空间中,函数名称相同,参数类型.顺序或数量不同的一类函数,同一函数名的函数能完成不同 ...

  8. acm新手小白必看系列之(5)——枚举进阶例题精讲

    acm新手小白必看系列之(5)--枚举进阶例题精讲 1.牛奶碑文(暴力枚举) 小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和 ...

  9. easypoi 语法_高中语法精讲系列七丨高中英语八大语法之“名词性从句”要点归纳...

    在句子中起名词作用的从句叫名词性从句,包括主语从句.宾语从句.表语从句和同位语从句. 一. 主语从句 在句子中充当主语的从句叫主语从句,通常由从属连词(that, whether)和连接代词(what ...

最新文章

  1. python 把字母转数字
  2. linux 查看进程端口_如何简单有效的查看windows进程使用了哪些端口
  3. 菜鸟学习日记:跟我一起学office2007之Excel【02基础篇】04Excel基础知识二
  4. 磁金融宣布完成1.2亿元B轮融资,宽带资本领投
  5. SpringCloud(第 057 篇)CentOS7 安装 maven 编译工具
  6. rockemq 发送延迟消息_RocketMQ系列(五)广播与延迟消息
  7. java高并发(二十一)高并发场景下缓存常见问题
  8. 数据库引起的性能瓶颈应如何优化?
  9. JVM 调优系列之图解垃圾回收
  10. MSP430F5529 DriverLib 库函数学习笔记(九)SPI
  11. 太辛苦的钱,我建议不要挣
  12. C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
  13. 路漫漫其修远兮,吾要上下左右前后而求索
  14. 电容器单位及电容器单位换算
  15. CwRsync实现文件同步(windows或linux服务器通用)
  16. div九宫格图片布局
  17. 阿里云服务器Ubuntu系统搭建mqtt服务器
  18. 【愚公系列】2022年11月 .NET CORE工具案例-.NET 7中的WebTransport通信
  19. 使用纯碎的HTML CSS制作多拉A梦(即为CSS画图)
  20. vue 插件qs使用

热门文章

  1. 开源中国源码学习(四)——主界面总体认识
  2. 大数据分析就业培训课程大纲分享
  3. 蓝桥杯算法训练cowboys-dp-递归-python题解
  4. 高仿马蜂窝旅游头像泡泡动画
  5. 子午线收敛角python代码
  6. 他,生物系毕业,刚入职连Java都没听过,却在马云的要求下,三周写出淘宝网雏形...
  7. 【新词发现】基于SNS的文本数据挖掘、短语挖掘
  8. 举头望明月打计算机术语,2016年猴年中秋灯谜大全
  9. workflow实例
  10. python初中必背语法_全初中必背英语语法知识汇总