【Android】Kotlin教程(4)
文章目录
- 1.field
- 2.计算属性
- 3.主构造函数
- 4.次构造函数
- 5.默认参数
- 6.初始化块
- 7.初始化顺序
- 7.延迟初始化lateinit
- 8.惰性初始化
1.field
field
关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时,可以使用 field
来访问或设置该属性的实际存储值。
class Player {var age: Int = 0get() = field // 自定义 getterset(value) { // 自定义 setterif (value >= 0) {field = value} else {println("年龄不能为负数")}}
}fun main() {val player = Player()player.age = 30 // 正常设置println(player.age) // 输出 30player.age = -5 // 尝试设置无效的年龄println(player.age) // 输出 30(因为设置失败,所以仍然是 30)
}
更复杂的自定义行为
class Person {private var _age: Int = 0 // 私有字段var age: Intget() {println("获取年龄: $_age")return _age}set(value) {if (value >= 0) {println("设置年龄: $value")_age = value} else {println("年龄不能为负数: $value")}}
}fun main() {val person = Person()person.age = 30 // 输出: 设置年龄: 30println(person.age) // 输出: 获取年龄: 30// 30person.age = -5 // 输出: 年龄不能为负数: -5println(person.age) // 输出: 获取年龄: 30// 30
}
- field 关键字:在自定义的 getter 和 setter 中,field 代表属性背后的实际存储字段。
- 自定义 getter 和 setter:允许你在读取和写入属性时执行额外的逻辑,如数据验证、日志记录等。
- 私有字段:为了更好地控制属性的访问,可以使用私有字段来存储实际值,并通过公开的属性提供访问接口。
2.计算属性
- 计算属性:这些属性没有后台字段来存储值,而是通过 getter 方法在每次访问时计算并返回值。
- 自定义 getter:你可以在类中定义一个没有显式初始化值的 val 属性,并为其提供一个自定义的 getter 方法。
class Rectangle(val width: Int, val height: Int) {// 计算属性val area: Intget() = width * height // 自定义 getter
}fun main() {val rectangle = Rectangle(10, 5)println("宽度: ${rectangle.width}") // 输出 宽度: 10println("高度: ${rectangle.height}") // 输出 高度: 5println("面积: ${rectangle.area}") // 输出 面积: 50
}
3.主构造函数
在People类的定义头中定义一个主构造函数,使用临时变量为Player的各个属性提供初始值,在Kotlin中,为了便于识别临时变量通常都会以下划线开头的名字命名。
class People(_name:String,_age:Int,_isNormal:Boolean
) {var name = _nameget() = field.capitalize()set(value){field = value.trim()}var age = _ageget() = fieldset(value){field = value.absoluteValue}var isNormal = _isNormal
}fun main(){val people = People("Jack", 20, true)println(people.name)println(people.age)println(people.isNormal)
}
4.次构造函数
除了主构造函数还有次构造函数,我们可以定义多个次构造函数来配置不同的参数组合。
class People0(_name:String,var age:Int,var isNormal:Boolean
) {var name = _nameget() = field.capitalize()set(value){field = value.trim()}constructor(name : String) : this(name , age = 10, isNormal = false) {this.name = name.capitalize()}}fun main(){val people0 = People0("rose")println(people0.name) // Roseprintln(people0.age) // 0println(people0.isNormal) // false}
5.默认参数
定义构造函数时,可以给构造函数指定默认值,如果用户调用时不提供值参,就是用这个默认值。
class People1(_name:String,var age:Int = 99,var isNormal:Boolean = false
) {var name = _nameget() = field.capitalize()set(value){field = value.trim()}constructor(name : String) : this(name , age = 10, isNormal = false) {this.name = name.capitalize()}}fun main(){val people1 = People1(_name = "jim")println(people1.name) // Jimprintln(people1.age) // 99println(people1.isNormal) // false
}
6.初始化块
初始化块可以设置变量或值,以及执行有效性检查,如检查传给某构造函数的值是否有效,初始化块代码会在构造类实例时执行。
class People1(_name:String,var age:Int = 99,var isNormal:Boolean = false
) {var name = _nameget() = field.capitalize()set(value){field = value.trim()}constructor(name : String) : this(name , age = 10, isNormal = false) {this.name = name.capitalize()}init {require(age > 0){"年龄设置不能小于0"}}
}fun main(){val people1 = People1(_name = "jim",-1, false)println(people1.name) // Jimprintln(people1.age) // 198println(people1.isNormal) // false
}
7.初始化顺序
- 主构造函数里声明的属性
- 类级别的属性赋值
- init初始化块里的属性赋值和函数调用
- 次构造函数里的属性赋值和函数调用
class Student(_name : String,val age : Int
){var name = _namevar score = 10var hobby = "music"val subject : Stringinit {println("initializing student...")subject = "Chinese"}constructor(_name:String) : this(_name,10){score = 100}
}fun main(){val student = Student("Jack")}
public Student(@NotNull String _name) {Intrinsics.checkNotNullParameter(_name, "_name");this(_name, 10);this.score = 100;}public Student(@NotNull String _name, int age) {Intrinsics.checkNotNullParameter(_name, "_name");super();this.age = age;this.name = _name;this.score = 10;this.hobby = "music";String var3 = "initializing student...";System.out.println(var3);this.subject = "Chinese";}
7.延迟初始化lateinit
- 使用lateinit关键字相当于做了一个约定:在用它之前负责初始化
- 只要无法确认lateinit变量是否完成初始化,可以执行isInitialized检查
class Player4 {lateinit var equipment : Stringfun ready(){equipment = "AK-47"}fun battle(){if (::equipment.isInitialized){println(equipment)}else{println("没有武器")}}
}fun main(){val player4 = Player4()// player4.ready()player4.battle()
}
8.惰性初始化
延迟初始化并不是初始化的唯一方式,你也可以暂时不初始化某个变量,知道首次使用它,叫做惰性初始化。
class Player5(_name :String) {var name = _nameval config by lazy {loadConfig()}private fun loadConfig():String{println("loading...")return "xxx"}
}fun main() {val p = Player5("kim")Thread.sleep(4000)// 4s后才会打印println(p.config)
}
相关文章:
【Android】Kotlin教程(4)
文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时,可以使用 field 来访问或设置…...
机票电子行程单如何批量查验?Java机票电子行程单查验接口示例-发票查验接口
机票电子行程单来了,它方便了人们的出行。现如今,随着旅游、差旅市场的回暖与线上业务的蓬勃发展,机票电子行程单的需求量急剧攀升,如何高效且准确地查验这些电子行程单成为许多企业和财务部门关注的焦点。传统的人工查验流程耗时…...
记录element-ui改造select显示为table,并支持多查询条件
最近遇到的一个需求 , 很有趣,是需要一个select组件,要求显示工号,员工姓名,以及区域 三个字段,并且要支持三个字段的查询。显然element原生的组件不适用,这时候我们需要改造一下,把…...
Spearman、Pearson、Euclidean、Cosine、Jaccard,用来衡量不同数据之间的相似性或差异性
1. Spearman相关系数: 用于衡量两个变量之间的排序关系的强度和方向。Spearman相关系数关注的是两个变量的排序一致性,而不关心具体的数值大小。值的范围为-1到1,1表示完全正相关,-1表示完全负相关,0表示无相关性。常…...
Suno 歌曲生成 API 对接说明
随着 AI 的应用变广,各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多,从最初的写作,到医疗教育,再到现在的音乐。 Suno 是一个专业高质量的 AI 歌曲和音乐创作平台,用户…...
详细且系统的Spring Boot应用开发
为了帮助大家更好地理解如何使用Spring Boot来构建一个基础的Web应用程序,我将通过一个简单的例子来进行说明。这个例子将是一个基本的RESTful API服务,用于管理图书信息。 项目准备 1. 开发环境设置(这个我之前有发文,这里就不详…...
线程支持库(C++11)
线程支持库包含了线程,互斥锁,线程条件变量(class thread),定义于<thread> 线程提供一个并发的实例,需要对应一个“线程函数” 线程的主要任务就是去执行这个"线程函数" 既然线程需要提供一个线程函数,…...
【计网】深入理解NAT机制,内网穿透与内网打洞,代理服务
我没胆量犯错 才把一切错过 --- 林夕 《我对不起我》--- 一文了解NAT机制,代理服务,内网穿透 1 再谈 NAT 机制2 内网穿透与内网打洞3 代理服务器 1 再谈 NAT 机制 NAT机制我们在解决IP地址不足的问题中提到过。为了解决IP地址不足的问题,采…...
C# 创建型设计模式----工厂模式
1 、什么是工厂模式 简单来说就是由一个对象去生成不同的对象,工厂模式是用工厂方法代替new操作的一种模式。工厂方法封装了多个相关联类的new方法,每次实例化这些类的时候不需要new多次,只需要调用工厂类的对应方法即可实例化这些类&#x…...
java中Scanner的nextLine和next方法
思考,输入1 2 3 4 5加上enter,输出什么 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[][] m new int[2][2];for (int i 0; i < 2; i) {for (int j 0; j < 2;…...
2024年全国山洪径流模拟与洪水危险性评价技术及典型地区洪水淹没及损失分析
洪水淹没危险性(各种年遇型洪水淹没)是洪水损失评估、风险评估及洪水应急和管理规划等工作的重要基础。当前开展洪水危险性研究工作中的主要困难之一是水文资料稀缺,尤其是径流资料稀缺,既包括径流观测资料在时间上的短缺…...
CDC 同步数据需要的MySQL数据权限
授权命令如下: grant Replication client on *.* to username%; grant Replication slave on *.* to username%; flush privileges;...
Ubuntu20.04 更新Nvidia驱动 + 安装CUDA12.1 + cudnn8.9.7
一、概述 最近客户给了几台GPU服务器,长期放置落灰那种,然后想利用起来,所以上去看看了配置,系统是Ubuntu20.04,相关的驱动版本稍嫌老一些,所以需要更新Nvidia驱动,同时在安装CUDA和CUDNN,查看了显卡型号之后,打算使用onnxruntime进行推理,对比了版本,最后选择了CUD…...
算法自学 Lesson3 - 逻辑回归(LR)
目录 背景 一、适用数据集 1. 数据集选择 1.1 领域 1.2 数据集维度 1.3 记录行(样本数量) 2. 本文数据集介绍 3. 数据集下载 注意 二、逻辑回归的基本原理 1. 目的 2. Sigmoid 函数 3. 类别划分 4. 召回率 三、代码 1. 导入所需包&数…...
文件IO流
1.文件流概念 2.文件创建方式 3.常用方法 4.IO流原理 (1)InputStream,OutputStream, Reader, Writer四个都是抽象类,无法直接new, 需要由子类继承,然后new子类; (2)Reader和Writer…...
拥塞控制与TCP子问题(粘包问题,异常情况等)
拥塞控制 除了拥塞控制 以上的策越都是为了解决tcp 客户端和服务端提高效率,解决丢包的策略 但是拥塞控制是了为解决网络拥堵 出现了大面积丢包,我们发送方会判定是网络出现了问题? 丢包好解决,我们直接采用超时重传&#…...
stm32入门教程--DMA 超详细!!!
目录 简介 工作模式 1、数据转运DMA 2、ADC扫描模式DMA 简介 工作模式 1、数据转运DMA 这个例子的任务是将SRAM的数组DataA,转运到另一个数组DataB中,这个基本结构里的各个参数应该如何配置呢? 首先是外设站点和存储器站点的起始地址、…...
【使用Flask构建RESTful API】从零开始开发简单的Web服务!
使用Flask构建RESTful API:从零开始开发简单的Web服务 引言 随着Web应用程序的广泛使用,RESTful API已成为现代Web服务的核心技术之一。通过RESTful API,我们可以轻松地创建、读取、更新和删除(CRUD)数据,…...
用sdcc给51单片机编译C程序
学习单片机大部分人用的是Keil uVision,虽然好用,可大部分人用的是盗版,其实单片机程序小的话,完全可以用文本编辑器(推荐notepad)编写,然后用免费的sdcc来编译,下面介绍一下大致的过程。 sdcc…...
Java Lock LockSupport 源码
前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & LockSupport & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & LockSupport & 总结》(学习总结/最新…...
Elasticsearch基础操作入门
阅前准备知识 学习 Elasticsearch (简称 ES) 的查询方式,建议从以下几个步骤入手: 理解 Elasticsearch 的基础概念 首先要了解 Elasticsearch 的核心概念,例如: Index(索引):相当于数据库中…...
跨域问题解决办法
跨域问题在Web开发中是一个常见的问题,特别是在前后端分离的开发模式下。以下是一些解决跨域问题的办法: 一、后端配置CORS(跨来源资源共享) CORS是一种机制,它使用额外的HTTP头来告诉浏览器一个网页的当前来源&…...
【数据结构与算法】力扣 23. 合并 K 个升序链表
题干描述 23. 合并 K 个升序链表 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入: lists [[1,4,5],[1,3,4],[2,6]] 输出: [1,1,2,3,4,4,5,6]…...
Java Lock CountDownLatch 总结
前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & CountDownLatch & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & CountDownLatch & 总结》(学习总…...
vue+spreadjs开发
创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…...
针对初学者的PyTorch项目推荐
文章目录 1. MNIST手写数字识别2. CIFAR-10图像分类3. 图像风格迁移4. 文本生成(使用RNN)5. 简单的问答系统6. 简单的生成对抗网络(GAN)7. 简单的推荐系统 对于初学者来说,选择一些简单且具有教育意义的项目来实践PyTo…...
Helm Chart文件介绍
介绍(这个还没有完善 ,目前在找工作呢) Helm是Kubernetes的包管理器,类似于Ubuntu中的apt、CentOS中的yum或Python中的pip,可以快速查找、下载和安装软件包。Helm主要由客户端组件helm和服务端组件Tiller组成…...
1Panel 是新一代的 Linux 服务器运维管理面板
1Panel 是一款新一代的 Linux 服务器运维管理面板,旨在通过现代化的 Web 界面帮助用户轻松管理 Linux 服务器。它集成了主机监控、文件管理、数据库管理、容器管理等功能,并且支持多语言和国际化,包括英语、中文(繁体)和日语。以下是 1Panel …...
Qml-ShaderEffect的使用
Qml-ShaderEffect的使用 ShaderEffect的概述 ShaderEffect使用自定义的顶点和片段着色器用于渲染一个矩形。用于在qml场景中添加阴影、模糊、着色和页面卷曲等效果。 Qt5和Qt6中ShaderEffect有一定区别,在Qt6中由于支持不同的渲染API,ShaderEffect是用…...
鸿蒙next之axios二次封装并携带cookie
由于官方提供的ohos.net.http模块,直接使用不是很灵活,就引入了第三方ohos/axios库。 以下是引入axios并进行二次封装的步骤: 1、DevEco Studio打开终端输入命令安装插件 ohpm install ohos/axios 2、新建RequestUtil.ets import { JSON, …...
湖南网站制作/站长之家网站排行榜
方法中返回的对象,一般不会造成内存溢出,但是一下情况就是刚好造成的内容溢出: 如果对象的引用刚好被单例所持有的话,JVM就不会回收该引用。 1、创建对象 Info info new Info(); 复制代码new Info()的时候,会返回一个…...
做么网站有黄/足球排名最新排名世界
管理使用者和设立权限的命令命令说明命令说明chmod用来改变权限useradd用来增加用户su用来修改用户5.1 chmod命令chmod命令用来改变许可权限。读取、写入和执行是许可权限中的三个主要设置。因为用户在他们的账号被创建时就被编入一个组群,所以还可以指定那些组群可…...
wordpress 网络图片不显示图片/天津百度推广
TA-Lib(Technical Analysis Library, 即技术分析库)是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标,如MACD、RSI、KDJ、动量指标、布林带等。 首先打开python 安装包下载网站: 官网下载地址 https://www.lfd.uci.edu/~gohlke/pythonlib…...
古风网站建设模板/seo入门基础教程
一、什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式。这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在Python中…...
餐饮加盟网站怎么做/最新国际新闻头条今日国际大事件
1.对单字符的查找: 1.1单字符: ‘X’ $ grep ‘q’ passwd //查找单个字符 1.2 范围字符 [] [^] 1.3 任意字符 . $ grep [1-9] passwd //查找某个范围的单个字符(范围) $ grep [a-zA-Z] passwd //查找某个范围的单个字符ÿ…...
网站建设无锡/口碑营销的产品
在发送通知邮件的时候, 假如可以有漂亮的邮件模板就更好了,但是出于安全的原因, 邮件一般不支持 link 或者 style 样式,只能通过内联的方式。找到了 The Automatic CSS Inliner Tool。有了自动转换工具,那就简单了。首…...