Kotlin 类
文章目录
- 什么是类
- 类的属性
- 类的方法(行为)
- 构造函数
- 主构造
- 次构造
- 类的实例化(对象)
- 伴生对象
- this
什么是类
在 Kotlin 中,变量类型都是类,像我们常见的Int、String等等,都是类。
为什么要分类?其实原因很多,就像有些时候,只要提起猫,你的脑海中立马浮现出猫捉老鼠、猫吃鱼······至少不是汪汪叫的猫。有了猫这一类别,我们就能很容易地将其与它所拥有的行为、特点联系起来。还有些情况,像是一个巨大的图书馆,如果各种书都没有一定规律地堆放在一起,我们很难去找到我们想要的书。
在 Kotlin 中,使用class去定义一个类:
class 类名 { 属性/方法 }
我们能够像描述一只猫一样去定义一个类,这样就足够了:
class Cat
类名首字母需要大写,而一般情况下变量和函数采用驼峰命名(首个单词小写,后面如果有其他单词,首字母大写):
class MyClassval myVariable = "变量"fun myFun() {}
类的属性
属性,例如一只猫是什么颜色的?有多高?喜欢吃什么?就是用于描述类状态的一系列变量。直接将其定义于类中即可:
class Cat {val name: String = "小橘"
}
类的方法(行为)
方法,或者叫函数,可定义该类所具有的行为:
class Fishclass Cat {fun eat(fish: Fish) {}
}
构造函数
构造函数可以让我们在初始化类对象(将猫这一类具体到某一只猫上)时传入参数,或者直接在构造函数中声明类的属性。
主构造
可以在类名后加一个小括号,并写入对应的参数、属性。这与函数类似:
class 类名([[val|var] 属性名: 类型], [参数名: 类型], ...) { 属性/方法 }
我们可以给猫定义一些属性:
class Cat(var name: String, val color: String)
也可以给它们设置默认值:
class Cat(var name: String, val color: String = "橘色")
我们也可以使用lateinit var将其定义于类中,并使用init和参数将其初始化,constructor可省:
class Cat constructor(var name: String, colorParam: String) {lateinit var color: Stringinit {color = colorParam}
}
或者是直接将color赋值为colorParam:
class Cat(var name: String, colorParam: String) {val color = colorParam
}
Note:Kotlin 中可以使用
lateinit关键字修饰可变变量,这样变量就可以暂时不用赋值。但是在使用时如果还未赋值,就会抛出异常:kotlin.UninitializedPropertyAccessException。lateinit不支持基本类型(Primitive Types,包含数字、字符)和可空类型。// 这些是不被允许的 // 数字 lateinit var byte: Byte lateinit var short: Short lateinit var int: Int lateinit var long: Long lateinit var float: Float lateinit var double: Double lateinit var boolean: Boolean // 字符 lateinit var char: Char // 任何可空类型 lateinit var nullableAny: Any?
次构造
很多时候主构造并不能满足我们的需求,我们可以再定义次构造。次构造使用constructor声明,必须基于主构造,使用this()调用主构造。
class Cat(val name: String, val color: String) {constructor(name: String): this(name, "橘色") {}
}fun main() {val myCat = Cat("小橘")println("${myCat.name} 是 ${myCat.color} 的")
}
小橘 是 橘色 的
类的实例化(对象)
可以像调用函数一样调用它,生成Cat对象,使用.即可访问对象的属性或方法(行为):
class Cat(val name: String, val color: String)fun main() {val myCat = Cat("小橘", "橘色")print("${myCat.name} 是 ${myCat.color} 的")
}
小橘 是 橘色 的
伴生对象
对象实例化后,每个对象都拥有自己的属性值(例如两个Cat对象可能有不同的color)。如果我们要声明一些该类所有对象都共有的,并且是不受对象影响的属性或方法,可以借助companion object来定义:
class Cat {companion object {const val FAMILY = "猫科"}
}
Note:在定义不可变的顶层变量(文件中的最外面)或对象变量(
object)时,如果该变量为基本类型(Primitive Types,包含数字、字符)或String,则建议使用const关键字修饰。特别地,如果该变量为对象变量,IDEA会提示需要将变量名改为全大写:object Object {const val NAME = "一个单词直接全大写"const val A_MULTI_WORDS_NAME = "多个单词需要加下划线分割" }
我们可以通过以下两种方式来访问该属性(通常采用Cat.FAMILY):
fun main() {println(Cat.FAMILY)print(Cat.Companion.FAMILY)
}
猫科
猫科
本质上是定义一个对象object(默认名称为Companion),我们可以指定该对象的名称,这并不影响我们使用它:
class Cat {companion object CatCompanion {const val FAMILY = "猫科"}
}fun main() {println(Cat.CatCompanion.FAMILY)print(Cat.FAMILY)
}
猫科
猫科
甚至可以继承(Kotlin 中使用: 被继承类()表示继承,这将在后续文章提到):
class Cat {companion object CatCompanion: Base() {const val FAMILY = "猫科"}
}open class Base
Kotlin 并不支持使用对象来访问伴生对象的属性或方法:
fun main() {val cat = Cat()// cat.FAMILY 这是错误的
}
this
Kotlin 类中可以使用this指定类中的属性或方法,这在很多时候是可以省略的。如果有时候出现混淆,可以通过使用this避免这一情况:
class Cat(var name: String) {fun changeName(name: String) {// 函数参数的 name 与 Cat 的 name 并不是同一个// 使用 this.name 指定 Cat 的 name// 如果不指定,默认会访问到最小范围内的 name// 这里的最小范围是函数作用域中的 namethis.name = name}
}
伴生对象中的this只能访问到伴生对象的属性或变量,因为它是独立于类对象的:
class Cat(var name: String) {companion object {const val FAMILY = "猫科"fun test() {this.FAMILY// this.name 错误的}}
}
在扩展函数中使用:
class Cat(var name: String)fun Cat.speck() {print("${this.name}: 喵喵喵")
}fun main() {Cat("小橘").speck()
}
小橘: 喵喵喵
相关文章:
Kotlin 类
文章目录 什么是类类的属性类的方法(行为)构造函数主构造次构造 类的实例化(对象)伴生对象this 什么是类 在 Kotlin 中,变量类型都是类,像我们常见的Int、String等等,都是类。 为什么要分类&a…...
Forth Python语言:深度解析其四维、五维、六维与七维之奥秘
Forth Python语言:深度解析其四维、五维、六维与七维之奥秘 在编程语言的浩瀚星空中,Forth Python以其独特的魅力与深邃的内涵,吸引着众多探索者的目光。然而,这门语言究竟有何独到之处?本文将从四维、五维、六维和七…...
MySQL--复合查询
之前学过了基本的查询,虽然已经够80%的使用场景了,但是依旧需要了解剩下的20%。 一、多表笛卡尔积(多表查询) 以前我们使用基本查询的时候,from后面就跟一张表名,在多表查询这里,from后面可以跟…...
前端项目开发,3个HTTP请求工具
这一小节,我们介绍一下前端项目开发中,HTTP请求会用到的3个工具,分别是fetch、axios和js-tool-big-box中的jsonp请求。那么他们都有哪些小区别呢?我们一起来看一下。 目录 1 fetch 2 axios 3 js-tool-big-box 的 jsonp 请求 …...
Java_Mybatis
Mybatis是一款优秀的持久层框架,用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据: 代码演示: UserMapper: Mapper //被调用时会通过动态代理自动创建实体类,并放入IOC容器中…...
2024HW|常见红队使用工具
目录 什么是HW? 什么是网络安全红蓝对抗? 红队 常见工具 信息收集工具 Nmap 简介 漏洞扫描工具 Nessus简介 AWVS 简介 抓包工具 Wireshark简介 TangGo 简介 web 应用安全工具 Burpsuite 简介 SQLMap webshell 管理工具 蚁剑 冰蝎 后…...
Redisson集成SpringBoot
前言:Redisson集成SpringBoot主要有两种方式,一个是使用redisson-spring-boot-starter依赖(优先推荐),毕竟springboot主打的就是约定大于配置,这个依赖就是为springboot准备的。 再一种方式就是引入rediss…...
设计模式(十二)行为型模式---模板方法模式
文章目录 模板方法模式结构优缺点UML图具体实现UML图代码实现 模板方法模式 模板方法模式(Template Method)是一种基于继承实现的设计模式,主要思想是:将定义的算法抽象成一组步骤,在抽象类中定义算法的骨架ÿ…...
【气象常用】剖面图
效果图: 主要步骤: 1. 数据准备:我用的era5的散度数据(大家替换为自己的就好啦,era5数据下载方法可以看这里【数据下载】ERA5 各高度层月平均数据下载_era5月平均数据-CSDN博客) 2. 数据处理:…...
LabVIEW高低温试验箱控制系统
要实现LabVIEW高低温试验箱控制系统,需要进行硬件配置、软件设计和系统集成,确保LabVIEW能够有效地监控和控制试验箱的温度。以下是详细说明: 硬件配置 选择合适的试验箱: 确定高低温试验箱的型号和品牌。 确认试验箱是否支持外…...
Flutter 中的 SliverFillViewport 小部件:全面指南
Flutter 中的 SliverFillViewport 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,SliverFillViewport 是一个用于 Custo…...
明日周刊-第12期
以前小时候最期待六一儿童节了,父母总会给你满足一个愿望,也许是一件礼物也许是一次陪伴。然而这个世界上其实还有很多儿童过不上儿童节,比如某些地区的小孩子,他们更担心的是能不能见到明天的太阳。 文章目录 一周热点航天探索火…...
算法之美阅读笔记
这里写自定义目录标题 序04 缓存 -- 忘了它吧 序 在图书馆闲逛时,一本封面为绿色的清新的书引起了我的兴趣,书名是算法之美。我心里不禁嘀咕,大家好喜欢使用某某之美作为书名,比如:数学之美、架构之美。美丽美好的事物…...
新手学习STM32还是ESP32
对于新手来说,选择学习STM32还是ESP32取决于个人的学习目标和背景。以下是针对这两种微控制器的详细分析,以便您做出更明智的选择: STM32 1. 处理器架构与性能 STM32采用单核或多核处理器架构,基于ARM Cortex-M0,M0…...
关于vlookup的第一个参数的个人理解
VLOOKUP(查阅值,包含查阅值和返回值的查找区域,查找区域中返回值的列号,精确查找或近似查找) 我个人理解,第一个参数应该叫线索值,因为我们要通过它去找与其对应的(也就是与其同行的…...
vector实现后半部分
一.迭代器失效 1.定义 指原迭代器在扩容/缩容/修改后指向无效元素或无效地址处 erase的迭代器失效 2.原因: 1.有的编译器实现erase会缩容拷贝 2.删除最后一个后,其指向无效元素 VS中不允许再次使用erase完的迭代器,为了让编写的代码移植…...
Maven配置
Maven – Download Apache Maven https://maven.apache.org/install.html 得下载有 bin的...
python 第一天
循环打印 while循环 languages ["Regional Assembly Language","Autocode","FORTRAN","IPL (LISP的先驱)","FLOW-MATIC (COBOL的先驱)","COMTRAN (COBOL的先驱)","LISP","ALGOL 58","F…...
Day03 左侧菜单数据绑定
一.左侧菜单数据绑定 1.首先,进行项目结构塔建。按照Prism 框架约定,要使用自动查找绑定功能。即View (视图)中自动查找并绑定到对应的ViewModel(视图模型,处理视图业务逻辑)。就需要在项目中按…...
JavaScript笔记三-JavaScript常用对象
1、数字对象(Number) 1.1 、属性 属性描述Number.MAX_VALUEJavaScript 中所能表示的最大值Number.MIN_VALUEJavaScript 中所能表示的最小值Number.NaN非数字Number.NEGATIVE_INFINITY负无穷,在溢出时返回Number.POSITIVE_INFINITY正无穷&am…...
ExcelJS 实战手册:从零构建企业级Excel报表系统
1. ExcelJS入门:为什么选择它构建企业报表? 第一次接触ExcelJS时,我正为一个电商项目头疼——每天要生成近万条订单数据的报表。尝试过直接输出CSV,但客户坚持要带格式的Excel文件;用PHPExcel处理又遇到内存溢出。直到…...
选吉他不踩坑:合板、单板、全单材质深度解析,新手看懂这篇就够
对于新手来说,挑选吉他时最容易被“合板”“单板”“全单”这些专业术语绕晕。其实,这三者的核心区别在于木材的构成方式,而木材直接决定了吉他的音色、手感以及使用寿命。今天我们就抛开品牌干扰,纯科普这三种材质的底层逻辑&…...
Greasy Fork:开源用户脚本平台的价值探索与实践指南
Greasy Fork:开源用户脚本平台的价值探索与实践指南 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork 一、价值定位:重新定义浏览器增强体验 1.1 开源平台的核心价值…...
ArcMap地图数字化实战:从加载地形图到保存成果的完整流程(附常见问题解决)
ArcMap地图数字化实战:从加载地形图到保存成果的完整流程(附常见问题解决) 在GIS领域,地图数字化是将纸质地图或图像转换为计算机可识别和处理的数字格式的基础工作。这项技能不仅是GIS专业学生的必修课,也是城市规划、…...
告别复杂配置:SDXL 1.0电影级绘图工坊开箱即用体验
告别复杂配置:SDXL 1.0电影级绘图工坊开箱即用体验 1. 为什么选择SDXL 1.0电影级绘图工坊 在AI绘图领域,Stable Diffusion XL(SDXL)1.0代表了当前最先进的文本到图像生成技术。然而,对于大多数非技术背景的创作者来说…...
告别手动建模!用Blender GIS插件5分钟搞定CARLA地图(附OSM数据源)
告别手动建模!用Blender GIS插件5分钟搞定CARLA地图(附OSM数据源) 在自动驾驶仿真领域,快速构建高精度地图一直是开发者的痛点。传统手动建模方式不仅耗时费力,还难以保证道路网络的拓扑准确性。现在,通过…...
OpenClaw自动化邮件处理:GLM-4.7-Flash模型分类与回复
OpenClaw自动化邮件处理:GLM-4.7-Flash模型分类与回复 1. 为什么需要自动化邮件处理 每天早晨打开邮箱时,我的收件箱总是堆满了各种邮件——工作汇报、会议邀请、订阅资讯、促销广告……手动分类和回复这些邮件至少会消耗我30分钟时间。直到上个月&…...
Wan2.2-I2V-A14B开源大模型:支持ONNX导出与边缘设备轻量化部署探索
Wan2.2-I2V-A14B开源大模型:支持ONNX导出与边缘设备轻量化部署探索 1. 开箱即用的私有部署方案 Wan2.2-I2V-A14B是一款强大的文生视频开源大模型,专为RTX 4090D 24GB显存环境深度优化。这个私有部署镜像已经内置了完整的运行环境和所有必要组件&#x…...
想给西安碑林、雁塔等区旧房装修?知名靠谱装修公司在哪找?
在西安碑林、雁塔等区拥有一套旧房,想要进行装修,却不知道如何找到知名靠谱的装修公司?别担心,本文将为你详细介绍选择装修公司的方法,并重点推荐西安王师傅装修工程有限公司,为你的旧房装修之旅提供可靠的…...
别再只盯着GPS了!从手机导航到无人机测绘,聊聊SPP、DGPS、RTK、PPP这几种定位技术到底该怎么选?
定位技术实战指南:从厘米级精度到全球覆盖的智能决策 站在一片待测绘的工地上,无人机工程师小王正面临一个关键抉择——该为这批新设备配置哪种定位模块?RTK的厘米级精度令人心动,但架设基准站的成本让他犹豫;PPP技术号…...
