文章目录

  • I . 属性 字段 总结
  • II . 属性声明
  • III . 属性初始化器
  • IV . get / set 属性访问器
  • V . 属性幕后字段 field
  • VI . 变量和常量的区别
  • VII . 延迟初始化属性 lateinit

I . 属性 字段 总结


属性与字段总结 :

① 完整的属性声明格式如下 :

var / val <属性名称>[: <属性类型>] [= <属性初始化器>] [<getter 方法>] [<setter 方法>]

② 属性初始化器 : 就是为属性赋予一个初始值 ;

③ 属性访问器 : 即 属性的 getter 和 setter 方法 ;

④ 属性幕后字段 : 属性的实际值存储在 field 幕后字段中 , 只能在属性访问器中可以使用 field 获取该值 ;

⑤ 延迟加载属性 : 该属性只能是引用类型 , 并且不能有初始化器和访问器 ;

II . 属性声明


1 . 属性声明格式 :

var / val <属性名称>[: <属性类型>] [= <属性初始化器>] [<getter 方法>] [<setter 方法>]

① 属性类型 : 首先设置属性的类型 , 常量 val 或 变量 var ;

② 属性名称 : 必须制定一个属性名称 ;

③ 属性类型 : 属性的类型可以指定 , 也可以在赋值时自动推断属性类型 , 可选设置 ;

④ 属性初始化器 : 给属性一个初始值 , 可选设置 ;

⑤ get 方法 : 获取属性的方法 , 可选设置 ;

⑥ set 方法 : 设置属性的方法 , 可选设置 ;

2 . 属性声明代码示例 : 代码中使用了上述所有的要素 , 除 val 常量外 ;

class Student {var age : Int = 18//每次访问属性值时 ( 获取属性值 ) , 都会自动调用该 get 方法get() {println("调用 get 方法")return field}//次为属性赋值时 , 都会调用 set 方法set(value) {println("调用 set 方法")field = value}
}

III . 属性初始化器


1 . 属性初始化器概念 : 属性赋值的操作就是属性的初始化器 ;

2 . 属性初始化器的代码优先级 : 属性的初始化器与 init{} 初始化代码块优先级相同 ;

3 . 属性初始化器执行时机 : 在主构造函数调用后 , 会按照类中的代码顺序从上到下执行属性初始化器和 init 初始化代码中的内容 ;

IV . get / set 属性访问器


1 . get 方法 : 属性定义了 get 方法 , 那么每次访问属性值时 ( 获取属性值 ) , 都会自动调用该 get 方法 ;

① 访问器 : get 方法又叫作访问器 , 用于获取属性值 ;

② 属性推断 : 使用 get 方法返回值可以自动推断属性类型 , 这种情况下属性的类型可以省略 ;

2 . set 方法 : 属性定义了 set 方法 , 那么每次为属性赋值时 , 都会调用 set 方法 ;

① 访问器 : set方法也叫作访问器 , 用于设置属性值 ;

② 参数 : set 方法的默认参数是 value , 也可以设置成其它值 ;

3 . 代码示例 : 代码中涉及到了 幕后字段 , 下一小节有详细说明 ;

class Student {var age : Int = 18//每次访问属性值时 ( 获取属性值 ) , 都会自动调用该 get 方法get() {println("调用 get 方法")return field}//次为属性赋值时 , 都会调用 set 方法set(value) {println("调用 set 方法")field = value}
}fun main() {var student : Student = Student();//给 age 属性赋值 , 此时会自动调用其 set 方法student.age = 18;//获取 age 属性值 , 此时会自动调用其访问器 get 方法student.age;
}

执行结果 :

调用 set 方法
调用 get 方法

get 和 set 方法都是属性访问器 , 用于获取或设置属性值

V . 属性幕后字段 field


1 . 属性与字段 :

① 类属性本质 : 类中定义的属性是一系列方法和代码块的集合 , 如 属性初始化器 , 属性访问器 , 属性声明等 , 这不是一个字段 ;

② 没有字段概念 : 在 Kotlin 语言中不能声明字段 , 只能声明属性 , 声明一个属性 , 附带声明了该属性的一系列方法和初始化代码等 ;

③ 幕后字段引入 : 在类中肯定是有一个字段用于存储属性的值 , 这个字段就是幕后字段 , 每个属性都有一个默认的幕后字段 ;

2 . 幕后字段 : 只有在 get / set 属性访问器中才可以使用幕后字段 field , 该字段代表了本属性的属性值 , 类型是属性本身的类型 ;

3 . 幕后字段示例解析 :

下面类中的 get 方法中使用 field 可以获取到 age 属性的 Int 值 ;

在 set 方法中 , 给 field 字段设置值 , 相当于给属性设置了 Int 值 ;

class Student {var age : Int = 18//每次访问属性值时 ( 获取属性值 ) , 都会自动调用该 get 方法get() {println("调用 get 方法")return field}//次为属性赋值时 , 都会调用 set 方法set(value) {println("调用 set 方法")field = value}
}

4 . 幕后字段产生 : 只有当在属性访问器中使用到了 field 字段后 , 系统才给提供幕后字段 ; 如果在访问器中没有使用 field 字段 , 那么系统就不提供幕后字段 ;

VI . 变量和常量的区别


1 . 修饰符不同 : 变量使用 var 修饰 , 常量使用 val 修饰 ;

2 . 初始化方式不同 :

变量即可以使用 set 初始化 , 也可以使用初始化器进行初始化 ;
常量不允许定义 set 方法 , 只能在初始化器中进行初始化 ;

VII . 延迟初始化属性 lateinit


1 . 修饰引用数据类型 : lateinit 不能修饰基本数据类型 , 只能修饰引用数据类型 , 如下图 , lateinit 修饰 Int 类型 , 报错 'lateinit' modifier is not allowed on properties of primitive types ;

2 . 属性不能有初始化器 : lateinit 修饰的数据类型不能定义初始化器 , 报错信息 'lateinit' modifier is not allowed on properties with initializer ;

3 . 属性不能有访问器 : lateinit 修饰的数据类型不能定义 getter 和 setter 属性访问器 ; 报错 'lateinit' modifier is not allowed on properties with a custom getter or setter ;

4 . 属性定义位置 : 尽量定义在类中 , 1.2 之后的 Kotlin 版本可以定义在主构造函数 和 局部变量中 , 不过为了代码兼容 , 还是在类中定义延迟初始化属性 ;

5 . 延迟初始化属性为空 : 如果在没有初始化属性值时 , 调用该 lateinit 延迟初始化属性 , 会抛出异常 ;

6 . lateinit 延迟初始化属性推荐示例 :

class Student {//在类中定义//不要定义 属性初始化器//不要定义 getter setter 属性访问器lateinit var name : String
}

【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )相关推荐

  1. Js中的数据属性和访问器属性

    Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...

  2. JavaScript | 数据属性与访问器属性

    属性类型 数据属性 - 包含一个数据值的位置,可以读取和写入值 [writable] 是否能修改属性的值 true [enumerable] 是否通过for in 循环返回属性(是否可以被枚举) tr ...

  3. 数据属性和访问器属性

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>数据 ...

  4. Kotlin实战指南九:延迟初始化

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/93764289 本文出自[赵彦军的博客] 高阶函数 lateinit 延迟初始化 ...

  5. 疯狂Kotlin讲义学习笔记07章:面向对象(上)对象,中缀,解构,幕后字段、属性,延迟初始化,访问控制符,构造器,继承,重写,super限定,重写,多态,is类型检查,as强制类型转换

    1.定义类的标准格式 修饰符 class 类名 [ constructor 主构造器]{零到多个次构造器定义零到多个属性....零到多个方法.... } 修饰符open是final的反义词,用于修饰一 ...

  6. kotlin获取属性_Kotlin程序| 属性获取器和设置器方法的示例

    kotlin获取属性 属性获取器和设置器方法 (Properties Getter and Setter Methods) Variable having a class-level scope, d ...

  7. 变量的三重属性_TypeScript基础入门 - 变量声明(三)

    转载地址TypeScript基础入门 - 变量声明(三)​www.gowhich.com 项目实践仓库 https://github.com/durban89/typescript_demo.gitt ...

  8. php中如何声明静态属性,PHP使用static关键字声明静态属性和静态方法

    PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...

  9. 声明一个国家基类Country,包含国名、首都、人口等属性,派生出省类Province,增加省会城市、人口数量属性。定义派生类对象,并对相应信息进行输出

    声明一个国家基类Country,包含国名.首都.人口等属性,派生出省类Province,增加省会城市.人口数量属性.定义派生类对象,并对相应信息进行输出. # include<iostream& ...

最新文章

  1. pythonset操作教程_Python集合(set)方式和使用方法
  2. shell getopts
  3. python3 copy_python3 深浅copy对比详解
  4. 【LeetCode】4.寻找两个正序数组的中位数
  5. 组合数据类型综合练习
  6. Nginx命令配置到系统环境
  7. Java:使用Fork / Join框架的Mergesort
  8. html:(19):单选框,复选框,下拉列表框
  9. 10个Python编程窍门,不懂就亏了
  10. 链接ftp,把文件或图片上传到ftp指定的文件夹中
  11. 【观察】从实践到赋能再到引领,华为释放数据中心无限潜
  12. 影视解说短视频制作教程,从找素材到配音,上手很简单
  13. 【渝粤教育】电大中专建筑施工技术作业 题库
  14. 【PBR理论】第2讲 BRDF理想漫反射(Diffuse)
  15. Python实现手机和电脑之间的文件传输
  16. Esp32-diy桌面可交互机器人
  17. 论文翻译阅读——Facial Emotion RecognitionUsing Deep Learning:Review And Insights
  18. 新手怎么租用传奇服务器
  19. kubeadm init 问题和解决问题记录
  20. python+jieba分析唐诗三百首

热门文章

  1. CKO将成为企业发展的军师--转自世界名人网
  2. Rails5 Controller Document
  3. 关于Java实现去除连续空格的延伸
  4. GitHub常用命令
  5. 作业 3 利用分支和循环结构解决问题
  6. [收集] C++ memset ,memcpy 和strcpy 的区别
  7. ImportError: Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
  8. 解决不同浏览器的css兼容问题
  9. MSSql-1内部数据库版本号
  10. requests + BeautifulSoup + json