13:kotlin类和对象 -- 属性(Properties)

定义属性

类属性可使用varval定义

class Address {var name: String = "Holmes, Sherlock"var street: String = "Baker"var city: String = "London"var state: String? = nullvar zip: String = "123456"
}

属性使用

fun copyAddress(address: Address): Address {val result = Address()result.name = address.name result.street = address.street// ...return result
}

Getters/setters

完整的定义一个属性的公式如下

var <propertyName>[: <PropertyType>] [= <property_initializer>][<getter>][<setter>]val <propertyName>[: <PropertyType>] [= <property_initializer>][<getter>]

[]中的内容都是可选的

var initialized = 1 // 有类型Int, 默认getter和默认setter
val simple: Int? // 有类型Int, 默认getter, 必须在构造函数中初始化
val inferredType = 1 // 类型Int,默认getter

如果定义了getter,则每次访问该属性时都会调用

class Rectangle(val width: Int, val height: Int) {val area: Int // 属性Int在这里是可选的,因为可以从getter中推断出类型get() = this.width * this.height
}

val area get() = this.width * this.height

如果自定义了setter,除属性初始化除外,每次属性赋值时都将调用它

var stringRepresentation: Stringget() = this.toString()set(value) {setDataFromString(value) // 解析字符串并把值赋给其他字段}

如果想要一个var类型的属性不能在外部被修改,可以使用private或者@Inject修饰setter方法

var setterVisibility: String = "abc"private set var setterWithAnnotation: Any? = null@Inject set // 官方说可以使用这个,但是未找到这个怎么用,说找不到这个注解

Backing fields

我称为隐藏字段

官方介绍是这样说的,让我觉得头大

In Kotlin, a field is only used as a part of a property to hold its value in memory. Fields cannot be declared directly. However, when a property needs a backing field, Kotlin provides it automatically. This backing field can be referenced in the accessors using the field identifier

我理解的意思是:在kotlin中,字段(field)并不是类中定义的属性,而是用来存属性值的一个东西。不能手动定义字段,当在访问器中需要用到字段的时候,kotlin已经为我们自动的定义好了,直接用就行了,字段用field关键字表示

class Rectangle() {var test = 4set(value) {field = value}get() = field
}

实例中,field,也就是字段,指向存储4的位置,而不是test

如果在访问器中不使用field,而是使用属性本身会怎样

class Rectangle() {var test = 4get() = test
}fun main() {val rectangle = Rectangle()println(rectangle.test)
}

在这里插入图片描述
idea提示这是一个递归调用,第13行也标志是一个递归调用。如果执行了代码则会报错Exception in thread "main" java.lang.StackOverflowError,这是因为在访问器中使用了属性名,而使用属性名会调用访问器,循环递归后内存溢出,所以需要使用field来代指属性,避免这个问题,就目前看field更像一个补丁

Backing properties

如果做一些不适合隐藏字段的事情,可以使用隐藏属性

class Rectangle() {private var _table: Map<String, Int>? = nullval table: Map<String, Int>get() {if (_table == null) {_table = HashMap() // Type parameters are inferred}return _table ?: throw AssertionError("Set to null by another thread")}
}

在JVM上:使用默认gettersetter访问私有属性做了优化,以避免函数调用开销。

编译时常量(Compile-time constants)

如果只读属性的值在编译时已知,则使用const修饰符将其标记为编译时常量。此类属性需要满足以下要求:

  • 它必须是顶级属性,或者是对象或伴生对象的成员。
  • 它必须使用String或原始类型的值进行初始化
  • 它不能是自定义getter

编译器将内联常量的用法,将对常量的引用替换为其实际值。但是,该字段不会被删除,因此可以使用反射与之交互

/*** 顶级变量*/
const val SUBSYSTEM_DEPRECATED: String = "方法过期了"class Demo() {@Deprecated(SUBSYSTEM_DEPRECATED) // 注解中可使用const修饰的属性fun foo() { }
}

延迟初始化属性和变量(Late-initialized properties and variables)

通常,声明为非空类型的属性必须在构造函数中初始化。然而,这样做并不方便。例如,属性可以通过依赖注入进行初始化,或者在单元测试的设置方法中进行初始化。

为了处理这种情况,可以使用lateinit修饰符标记属性

public class MyTest {lateinit var subject: TestSubject   // 延迟初始化 subject@SetUp fun setup() {subject = TestSubject()}@Test fun test() {subject.method()}
}

可以用在类的主体内声明的var属性(不在主构造函数中,且没有自定义的getter或setter时),以及顶层属性和局部变量。属性或变量的类型必须是非空的,并且不能是原始类型

在初始化之前访问lateinit属性会抛出一个特殊的异常,清楚地标识被访问的属性以及它尚未被初始化的事实

检查是否已经初始化

使用.isInitialized方法检查是否已经初始化

class TestSubject() {fun method() {}
}class MyTest {lateinit var subject: TestSubject fun test() {if (this::subject.isInitialized)subject.method()}
}

重写属性(Overriding properties)

下章讲解

委托属性(Delegated properties)

后边文章中再讲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lua_next

lua_pushnil(L);while(lua_next(L, -2)){// 栈状态&#xff1a;key : -2 value : -1// do something lua_pop(L, 1);} lua_next 先弹出一个值&#xff0c; 再放一对pair 到栈上&#xff0c; 参数 index 是表的位置 调用后&#xff1a; -1&#xff1a;value -2:key 因为会先…

力扣labuladong——一刷day59

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣549. 二叉树中最长的连续序列二、力扣1325. 删除给定值的叶子节点 前言 像求和、求高度这种基本的二叉树函数很容易写&#xff0c;有时候只要在它们的后…

一次解决套接字操作超时错误的过程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 在windows客户端使用QTcpSocket连接一个ubuntu服务端程序&#xff0c;出现套接字操作超时的错误。开始感觉还莫名其妙的&#xff0c;因为之前连接都是好好…

pandas超出print限制时如何查看完整dataframe

当设置了 pd.set_option(display.max_rows, None)&#xff0c;我们期望能够打印出数据框的所有行。然而&#xff0c;在某些情况下&#xff0c;即使设置了该选项&#xff0c;仍然无法完全打印出所有行的内容。这是因为数据量可能超出了系统的内存或显示限制。 为了解决这个问题…

鸿蒙系统扫盲(三):鸿蒙开发用什么语言?

1.两种开发方向 我们常说鸿蒙开发&#xff0c;但是其实鸿蒙开发分为两个方向&#xff1a; 一个是系统级别的开发&#xff0c;比如驱动&#xff0c;内核和框架层的开发&#xff0c;这种开发以C/C为主 还有一个是应用级别的开发&#xff0c;在API7以及以下&#xff0c;还是支持…

2023年全国职业院校技能大赛“ 信息安全管理与评估” 测试题

一、 单选题 &#xff08; 每题 2 2 分 &#xff0c;共 共 5 35 题&#xff0c;共 共 0 70 分&#xff09; 1、( )是指在信息的采集、加工、存储、传播和利用的各个环节中&#xff0c;用来规 范期间产生的各种社会关系的道德意识、道德规范和道德行为的总和。 A、信息规范 …

vue分环境打包及案例代码

Vue分环境打包可以帮助我们针对不同的环境(如开发环境、测试环境、生产环境等)打包出不同的版本,以满足不同的需求。下面是一个简单的Vue分环境打包的示例代码: 安装cross-env: npm install --save-dev cross-env在项目的根目录下创建不同的环境配置文件,如test.env.js…

Codeforces Round 907 (Div. 2) (C 贪心 D套路? F dfs序+差分树状数组)

A&#xff1a; 这种操作题&#xff0c;每次先想这个操作有什么性质 对于2^0来说可以操作 第1位 对于2^1来说可以操作 第1-2位 对于2^2来说可以操作 第1-4位 &#xff08;第3位无法单独修改&#xff09; 对于2^3来说可以操作 第1-8位&#xff08;第5 6 7位无法单独修改&…

Java中的i++是原子操作吗?

我们都知道i分为三步进行&#xff0c;分别是1:取到当前i的值&#xff0c;2&#xff1a;&#xff0c;3&#xff1a;将最终结果赋值 因此我们可通过创建两个线程&#xff0c;对同一个变量count,一个线程对count进行递增操作&#xff0c;另一个线程对count进行递减操作。每个线程…

Redis的高可用模式

1. 什么是高可用&#xff1f; 高可用&#xff08;High Availability, HA&#xff09;是指在信息技术中确保系统、服务或应用程序在绝大多数时间内都是可操作和可访问的能力。这通常涉及以下几个关键方面&#xff1a; 最小化停机时间: 高可用系统的目标是减少因硬件故障、系统升…

英语二笔记

完型填空 20题/0.5分 总分10, 至少拿8分 阅读理解A 20题/2分 总分40 至少拿24分 阅读理解B 5题/2分 总分10 至少拿6分 短文翻译 1题/15分 总分15分 至少拿9分 小作文 1题/10分 总分10分 至少拿6分 大作文 …

Talk | UCSB博士生许闻达:细粒度可解释评估初探

本期为TechBeat人工智能社区第551期线上Talk。 北京时间11月29日(周三)20:00&#xff0c;UC Santa Barbara博士生—许闻达的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “细粒度可解释评估初探”&#xff0c;分享了他们团队在具备解释性的细粒度…

流程不会搭建?集简云上线AI智能创建流程功能,辅助您更简单地创建自动化流程

用户在使用集简云创建流程时&#xff0c;经常会遇到的两个问题&#xff1a; 1. 不知道要如何选择应用动作&#xff0c;和动作的执行顺序&#xff1b; 2. 应用动作设置中的字段匹配&#xff0c;不知道要如何选择对应的字段&#xff1b; 集简云基于大量历史数据积累与自训练AI模…

BatchOutput PDF for Mac(PDF 批量处理软件)

BatchOutput PDF是一款适用于 Mac 的 PDF 批量处理软件。它可以帮助用户将多个 PDF 文件进行异步处理&#xff0c;提高工作效率。 BatchOutput PDF 可以自动化执行许多任务&#xff0c;包括 PDF 文件的打印、转换、分割、压缩、加密、重命名等&#xff0c;而且它还可以将自定义…

php许愿墙代码包括前端和后端部分

以下是一个简单的PHP许愿墙代码示例&#xff0c;包括前端和后端部分&#xff1a; 前端HTML代码&#xff08;index.html&#xff09;&#xff1a; <!DOCTYPE html> <html> <head><title>许愿墙</title> </head> <body><h1>许…

通过流量监控分析某个部门或客户端网络性能

在当今数字化时代&#xff0c;网络已经成为组织和企业不可或缺的基础设施之一。作为信息传输和数据交互的关键载体&#xff0c;网络的性能对于保障业务的稳定运行和提升工作效率至关重要。因此&#xff0c;对某个部门或客户端网络的性能进行分析和评估&#xff0c;有助于了解当…

MGF4964BL-01 低噪声 InGaAs HEMT(高电子迁移率晶体管) K波段放大器 微X型塑料封装

MGF4964BL-01超低噪声 InGaAs HEMT(高电子迁移率晶体管)设计用于K波段放大器。MGF4964BL-01是符合 RoHS 标准的产品&#xff0c;通过无铅认证。 MGF4964BL-01特征&#xff1a; f20GHz NFmin 时的低噪声系数。0.65 分贝(典型值) f20GHz 时的高相关增益 Gs 13.5dB(典型值。) MG…

spring cloud Eureka注册中心和Nacos注册中心

文章目录 Eureka注册中心.Eureka的结构和作用搭建eureka-server创建 服务引入eureka依赖编写启动类编写配置文件启动服务 服务注册1&#xff09;引入依赖2&#xff09;配置文件3&#xff09;启动多个user-service实例 服务发现1&#xff09;引入依赖2&#xff09;配置文件3&…

Stability AI 新发布SDXL Turbo:一款实时文本到图像生成模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

接入SCDN可以对网站进行防护,解决攻击问题吗?

最近遇到很多用户都在跟德迅云反馈自己网站遇到攻击问题&#xff0c;有的是反馈自己的网站用户反应打开网站很卡甚至打不开&#xff0c;有的用户自己的网站服务器都无法连接上了。通过德迅云安全对用户反馈的问题进行详细查看分析后&#xff0c;给用户提供了安全SCDN方案&#…