Kotlin系列——构造函数精讲
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
不能用于拥有定制getter
和setter
方法的属性
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系列——构造函数精讲相关推荐
- (java)玩转算法系列-数据结构精讲[学习笔记](一)不要小瞧数组
前言: 课程:玩转算法系列–数据结构精讲 更适合0算法基础入门到进阶(java版) 此处是个人学习笔记,用作回顾用途 不要小瞧数组 1.使用java中的数组 Main.java: public cla ...
- YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)
写在前面:大家好!我是[AI 菌],算法工程师一枚,2021年博客之星Top12,公众号[AI 修炼之路]作者.专注于计算机视觉.深度学习.图像处理技术,热衷于分享AI.CV.DL.ML.OpenCV ...
- 视频教程-php进阶课程之swoole系列课程精讲(第一季)-PHP
php进阶课程之swoole系列课程精讲(第一季) 多年一线互联网开发实战以及培训经验,对php开发,linux运维架构有丰富的经验,善于分析问题,解决问题. lampol ¥199.00 立即订阅 ...
- YOLO系列算法精讲:从yolov1至yolov4的进阶之路(呕心沥血2万字超全整理,建议收藏!)
从刚开始接触YOLO到现在也已经有大半年时间了,中间也陆陆续续接触过其它网络.最近又抽时间研究了一下YOLOv4. 因此,趁此机会,将yolov1到yolov4进行一个全面的整理和总结,希望对即将入坑 ...
- YOLO系列算法精讲:从yolov1至yolov4的进阶之路
参考资料: https://blog.csdn.net/wjinjie/article/details/107509243?utm_medium=distribute.pc_feed_blog_ran ...
- 【C++自我精讲】基础系列二 const
[C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...
- 【C++自我精讲】基础系列三 重载
[C++自我精讲]基础系列三 重载 0 前言 分二部分:函数重载,操作符重载. 1 函数重载 函数重载:指在同一名字空间中,函数名称相同,参数类型.顺序或数量不同的一类函数,同一函数名的函数能完成不同 ...
- acm新手小白必看系列之(5)——枚举进阶例题精讲
acm新手小白必看系列之(5)--枚举进阶例题精讲 1.牛奶碑文(暴力枚举) 小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和 ...
- easypoi 语法_高中语法精讲系列七丨高中英语八大语法之“名词性从句”要点归纳...
在句子中起名词作用的从句叫名词性从句,包括主语从句.宾语从句.表语从句和同位语从句. 一. 主语从句 在句子中充当主语的从句叫主语从句,通常由从属连词(that, whether)和连接代词(what ...
最新文章
- python 把字母转数字
- linux 查看进程端口_如何简单有效的查看windows进程使用了哪些端口
- 菜鸟学习日记:跟我一起学office2007之Excel【02基础篇】04Excel基础知识二
- 磁金融宣布完成1.2亿元B轮融资,宽带资本领投
- SpringCloud(第 057 篇)CentOS7 安装 maven 编译工具
- rockemq 发送延迟消息_RocketMQ系列(五)广播与延迟消息
- java高并发(二十一)高并发场景下缓存常见问题
- 数据库引起的性能瓶颈应如何优化?
- JVM 调优系列之图解垃圾回收
- MSP430F5529 DriverLib 库函数学习笔记(九)SPI
- 太辛苦的钱,我建议不要挣
- C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
- 路漫漫其修远兮,吾要上下左右前后而求索
- 电容器单位及电容器单位换算
- CwRsync实现文件同步(windows或linux服务器通用)
- div九宫格图片布局
- 阿里云服务器Ubuntu系统搭建mqtt服务器
- 【愚公系列】2022年11月 .NET CORE工具案例-.NET 7中的WebTransport通信
- 使用纯碎的HTML CSS制作多拉A梦(即为CSS画图)
- vue 插件qs使用