在上一次https://www.cnblogs.com/webor2006/p/11210181.html学习了Kotlin的伴生对象,这次来学习属性相关的东东。

属性揭秘:

先声明一个属性:

没啥可说的呀,很简单嘛,其实。。有深层次的东东,表现上看貌似是直接调用的age这个属性,其实是调用age的get方法,下面来看一个完整的例子:

这里就可以给这个属性定义一个get方法来将该属性进行初始化,在Kotlin中get方法的定义跟Java形式上是有区别的,如下:

其中类型是可以省略的,因为可以从get()进行推导:

这里还是先保留,另外还可以通过直接赋值给属性的办法来初始化它,如下:

接下来为了验证我们在调用属性是是调用属性的get方法,下面可以针对属性来在get()方法中打印一下日志,如下:

接下来再定义它的set方法:

接下来调用一下看一下是否调用了该属性的get 和 set,如下:

确实如此!!接下来回到常规使用,咱们再定义一个新的成员:

其实它是隐式有get和set方法,咱们显式的给它定义一下,IDE会给出冗余提示的:

总结一下,对于Kotlin属性的完整声明其实格式为:

其中再来说一下“backing filed,支撑字段(域)”,回顾下:

如果说没有这个概念,那我们没法return,比如说我们试着改一下:

此时会死循环,不信运行一下:

因为:

所以只能用backing field来解决。最后咱们从字体码的角度来观察一下是否默认属性真的生成为getter和setter方法,一切细节都会从字节码的角度看个透彻,如下:

确实如此~~那如果说我们想某个属性的set方法或者set方法不能被外界调用,此时加上访问修饰符【关于访问修饰符会在之后详细学习】,下面先来看set方法:

接下来看一个Getter方法,它跟Setter有一点不同,如下:

看错误提示:

所以咱们改一下:

延迟初始化:

我们知道在Koltin中声明的属性是必须被初始化或者将它定义成抽象的,如下:

那如果说我们不想在定义时就给该属性赋值,而是想在以后某个时刻再给它赋值,延迟初始化机制就应运而生,具体是这么搞的:

接下来咱们来模拟之后初始化的场景:

所以加上初始化语句:

所以下面将延迟初始化属性再总结下:

Kotlin要求非空类型的属性必须要在构造方法中进行初始化,但是有时这种要求不太方便,比如可以通过依赖注入或是单元测试情况下进行属性的赋值,通过lateinit关键字标识属性为延迟初始化,需要满足以下3个条件:

1、lateinit只能用在类体中声明的var属性上,不能用在primary constructor声明的属性上。

2、属性不能拥有自定义的setter和getter,如下:

3、属性类型需要为非空,且不能是原生数据类型,比如:

因为有这个特性,所以像Spring依赖注入框也能顺利的整合Kotlin了。

最新文章

  1. 移动App崩溃的测试用例设计
  2. Mina、Netty、Twisted一起学(六):session
  3. linux rdate
  4. CSS设置滚动条样式
  5. HAProxy安装及初步使用
  6. CodeSmith 7.01破解下载
  7. web及移动应用测试知识总结
  8. Most People Aren’t.
  9. SVG基础
  10. JS中创建自定义对象的方法
  11. Objectiv-C UIKit基础 NSLayoutConstraint的使用(VFL实现)
  12. win10 uwp 修改Pivot Header 颜色
  13. 部署tomcat环境
  14. C#语言中字段和属性相关知识剖析
  15. pdf.js插件使用记录,在线打开pdf
  16. hsdfz -- 6.17 -- day2
  17. 2018面向对象程序设计(Java)第15周学习指导及要求
  18. mybatis的批量操作
  19. 不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关)
  20. 关于Json-lib类库的使用

热门文章

  1. MinGW离线安装
  2. 【电子电路技术】PoE供电技术的优缺点
  3. PKUWC2020自闭记
  4. svn 版本控制搭建
  5. Mac和window实现双向数据传输
  6. Burp Suite 如何抓取HTTPS请求
  7. Kafka-Docker:使用Docker运行Apache Kafka的步骤
  8. Java开发笔记(一百二十三)AWT图像视图
  9. 深度学习-语言处理特征提取 Word2Vec笔记
  10. javascript 代码实例