kotlin类
一、定义
1、kotlin中使用关键字class 声明类,如果一个类没有类体,也可以省略花括号, 默认为public 类型的:
// 这段代码定义了一个公开的、不可被继承的Test类
class Test{}
// 没有类体,可以省略花括号
class Test
底层代码:class Test{} / class Test 底层编译成java代码 如下:
// final: 这个关键字说明Test类是一个最终类,意味着它不能被继承。
// 也就是说,不允许有其他类继承自Test类以扩展其功能。
public final class Test {
}
2、类中定义的变量必须初始化
class Foo{val x:Int = 1
}
二、构造函数
1、主构造函数:
(1)在kotlin中,一个类有一个主构造函数,并且可以有一个或者多个次构造函数。
注:所有次构造函数必须调用主构造函数。
// 下边定义类的主构造函数,且添加了2个Int类型的参数
class Test constructor(a: Int, b: Int) {
}
// 也可以省略constructor关键字,如果主构造函数没有任何注解或可见性修饰符:
class Test (a: Int, b: Int) {
}
(2)主构造函数的参数也可以作为类的属性存在,下边a
和 b
同时作为构造函数的参数和类的属性存在
// a和 b 都是类的属性
class Test constructor(val a: Int, var b: Int) {
}
// 也可以给参数使用默认值:
class Test constructor(val a: Int = 1, var b: Int = 2) {
}
// 或者在类里边定义属性
class Test01 (a: Int, b: Int) {// 在类定义类属性,此时a和b作为参数传进来var c: Int = a // 定义类属性cvar d: Int = b // 定义类属性dinit {println("$c+$d=${c+d}")}
}fun main() {Test01(1, 2)
}
作为参数:
在构造函数定义中,a
和 b
接收从外界传入的具体值,允许在创建 Test01
类的实例时初始化这些值。
作为属性val a: Int
表明 a
是一个只读属性(final变量),一旦在构造函数中初始化后,其值就不能再改变。var b: Int
表明 b
是一个可变属性(变量),在类的实例创建后,其值仍然可以被修改。
(3)类变量初始化时机
1、参数传递,初始化类中变量。
2、使用定义的默认值,初始化类变量。
3、如果不想第一时间初始化变量,可以使用 lateinit 懒加载:
class Test () {lateinit var a: Stringlateinit var b: String
}
注意事项:
为什么Int类型不能使用lateinit 懒加载?
原因如下:
对于基本数据类型(如 Int
、Double
、Boolean
等),它们不能为 null
,并且在声明时必须赋予一个初始值。由于基本类型不是引用类型,它们不存在“未初始化”的状态——它们要么有一个具体的值,要么在局部作用域内如果没有初始化就会导致编译错误。因此,lateinit
机制不适用于基本数据类型,因为基本类型总是有默认值(如 Int
的默认值是 0
),且不能为 null
。
(4)在类里边定义变量,kotlin默认会为每个属性添加getter和setter,当然你也可以显示的定义getter和setter
class Test (b:Int) {var a: Int = b// 为a变量定义getter,打印a变量时,输出2,getter优先级是最高的get() {return 2}set(value) {field = value}init {println(a) // 2}
}fun main() {Test(1)
}
类中属性的引用,跟方法引用一样:
// 方法定义
fun main() {// 引用Foo类中的x属性val r = Foo::x// 方式一:调用Foo类中的x属性,获取其值val r1 = r.get(Foo("hello"))println("r1 -> $r1") // r1 -> hello// 方式二:通过实例化的对象foo来引用Foo类中的x属性val foo = Foo("world")val r2 = foo::xprintln("r2 -> ${r2.get()}") // r2 -> world
}
class Foo(x:String) {val x:String = x
}
2、次构造函数:
(1)创建
// 记住一点:所有的次构造函数必须要调用主构造函数。
class Test (var name:String) {// 次构造函数的创建如下,// (1)在类里边添加constructor关键字// (2)通过this()来调用主构造函数 Test()// 且this()参数必须和主构造函数的参数一致constructor(name:String,age:Int): this(name){}
}
三、类实例化
1、在kotlin中实例化类后,会创建一个新的对象,并且返回对象的引用,在构造函数执行完毕后,会返回一个指向新创建对象的引用,这个引用可以被存储在一个变量中,以便后续使用。
class Test (var name:String)fun main() {val user:Test =Test("小王")// 通过user变量可以访问类中的属性、函数println(user.name) // 小王
}
2、类方法定义及调用
class Test(name: String) {// 定义info方法,参数为String类型fun info(name: String) {// 就近原则:所以输出 2println("名字为:${name}") // 2}
}fun main() {val test = Test("1")test.info("2")
}
在方法中,如果想调用主构造函数参数,需要使用 this. 的方式,且主构造函数参数必须是属性。
class Test(var name: String) {fun info(name: String) {// this 就是Test 实例化的对象println("名字为:${this.name}") // 1}
}fun main() {val test = Test("1")test.info("2")
}
四、接口
1、定义
// Foo类 实现 FooInterface接口
class Foo(val x: String):FooInterface{// 重写接口中foo方法override fun foo() {TODO("Not yet implemented")}
}
// 定义接口
interface FooInterface {// 定义接口中的方法fun foo()
}
2、实现接口
接口的实现,需要在实现类后边加上 : ,后边写上接口类名即可
// Foo类实现 FooInterface接口
class Foo(val x: String):FooInterface{
}
注意事项:
(1)接口的定义,不需要添加关键字 class。
(2)实现类继承某个接口,后边添加 : 然后填写接口名即可 class T( ): AInterface{ }
(3)重写接口中的方法,在实现类中 需要添加 关键字 override
五、抽象类
1、定义
// 定义抽象类
abstract class FooAbstract {// 定义抽象类中的方法abstract fun foo()
}
2、抽象类中,如果没定义abstract 关键字, 那么该方法默认是不可被重写的;如果需要重写,必须加上关键字 open :
// 定义抽象类
abstract class FooAbstract {// 定义抽象方法,可以被重写abstract fun gar()// 不可被重写的方法fun foo(){}// 可被重写的方法open fun bar(){}
}
3、类实现抽象类,重写里边的方法:
// Foo类 实现 FooAbstract抽象类
class Foo(val x: String):FooAbstract(){// 重写接口中foo方法override fun bar() {println("Foo:$x")}override fun gar() {println("Foo:$x")}
}
// 定义抽象类
abstract class FooAbstract {// 定义抽象方法,可以被重写abstract fun gar()// 不可被重写的方法fun foo(){}// 可被重写的方法open fun bar(){}
}
注意事项:
(1)定义抽象类,前边加上 abstract 关键字。
(2)抽象类中的方法(注意不是抽象方法),默认是不可被重写的,必须显示的加上关键字 open,才可以被重写。
(3)抽象类中的所有方法,有关键字 abstract 和open的方法,在实现类里边,必须全部被重写,否则不会被编译通过。
(4)继承抽象类写法 class T( ): Aabstract( ) { } ,抽象类后边必须添加括号。
(5)重写抽象类中的方法,跟接口实现一样,在实现类中 也需要添加 关键字 override。
六、同时继承接口及抽象类
// Foo类 实现 FooAbstract抽象类、FooInterface接口
class Foo(val x: String):FooAbstract(), FooInterface{// 重写了抽象类中 foo方法override fun foo() {TODO("Not yet implemented")}// 重写了接口中 bar方法override fun bar() {TODO("Not yet implemented")}
}
// 定义抽象类
abstract class FooAbstract {abstract fun foo()
}
// 定义接口
interface FooInterface{fun bar()
}
六、普通类的继承
1、继承普通类,普通类前边必须添加 open 关键字,才能被别的类继承:
// Foo类 实现 FooAbstract抽象类、FooInterface接口
open class Foo(val x: String):FooAbstract(), FooInterface{override fun foo() {TODO("Not yet implemented")}override fun bar() {TODO("Not yet implemented")}
}
// Foo2 继承 Foo 类,Foo类前边必须添加关键字 open
class Foo2(val y: String):Foo(y){
}
// 定义抽象类
abstract class FooAbstract {abstract fun foo()
}
// 定义接口
interface FooInterface{fun bar()
}
fun main(){Foo2("hello")
}
2、被继承类中的方法,如果不想被别的类复写某个方法,可以在方法卡那边加上关键字 final
open class Foo(a:String): FooInterface, FooAbstractClass(){override fun foo() {TODO("Not yet implemented")}// bar 方法不可被别的类重写final override fun bar() {TODO("Not yet implemented")}
}
class Foo2(val a: String):Foo(a){override fun foo() {}// 编译不会通过,因为Foo类中的bar方法,前边有关键字 finaloverride fun bar() {}
}
abstract class FooAbstractClass {abstract fun foo()
}
interface FooInterface {fun bar()
}
相关文章:

kotlin类
一、定义 1、kotlin中使用关键字class 声明类,如果一个类没有类体,也可以省略花括号, 默认为public 类型的: // 这段代码定义了一个公开的、不可被继承的Test类 class Test{} // 没有类体,可以省略花括号 class Test 底层代码&…...

android | studio的UI布局和代码调试 | UI调试 (用于找到项目源码)
网上找到一个项目,想快速的搞懂是怎么实现的,搞了半天发现原来android都升级到Jetpack Compose了,然后去找源码挺不容易的,摸索中发现了这个调试的方法,还可以。 https://developer.android.com/studio/debug/layout-i…...
LangChain实战技巧之六:一起玩转config(上篇)——ConfigurableField
简介 Config 包含两大类内容, ConfigurableField 可配置的字段 configurable_alternatives 可配置的替代方案 分别使用两篇文章来给大家介绍,本篇先介绍ConfigurableField 常规介绍 一些资料会这样介绍 model_spec model.configurable_fields(model…...

扫码称重上位机
目录 一 设计原型 二 后台代码 一 设计原型 模拟工具: 二 后台代码 主程序: using System.IO.Ports; using System.Net; using System.Net.Sockets; using System.Text;namespace 扫码称重上位机 {public partial class Form1 : Form{public Form1(){Initialize…...
操作系统入门 -- 进程的通信方式
操作系统入门 – 进程的通信方式 1.什么是进程通信 1.1 定义 进程通信就是在不同进程之间交换信息。在之前文章中可以了解到,进程之间相互独立,一般不可能互相访问。因此进程之间若需要通信,则需要一个所有进程都认可的共享空间࿰…...

Python读取wps中的DISPIMG图片格式
需求: 读出excel的图片内容,这放在微软三件套是很容易的,但是由于wps的固有格式,会出现奇怪的问题,只能读出:类似于 DISPIMG(“ID_2B83F9717AE1XXXX920xxxx644C80DB1”,1) 【该DISPIMG函数只有wps才拥有】 …...
elasticsearch的入门与实践
Elasticsearch是一个基于Lucene构建的开源搜索引擎。它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTP web接口和无模式的JSON文档。以下是Elasticsearch的入门与实践的基本步骤: 入门 安装Elasticsearch: 从Elasticsearch官网下载对…...

神经网络学习6-线性层
归一化用的较少 正则化用来解决过拟合,处理最优化问题,批量归一化加快速度 正则化(Regularization): 作用:正则化是一种用来防止过拟合的技术,通过向模型的损失函数中添加惩罚项,使…...
PHP框架详解 - CodeIgniter 框架
CodeIgniter 是一个成熟的轻量级 PHP 框架,专为小到中型的 Web 应用开发设计。它以其简洁、灵活和易于学习的特点而受到开发者的喜爱。 CodeIgniter 框架的特点包括: 轻量级:CodeIgniter 的核心非常小,加载速度快,适…...

奔驰EQS SUV升级原厂主动式氛围灯效果展示
以下是一篇关于奔驰 EQs 升级原厂主动氛围灯案例的宣传文案: 在汽车科技不断演进的今天,我们自豪地为您呈现奔驰 EQs 升级原厂主动氛围灯的精彩案例。 奔驰 EQs,作为豪华电动汽车的典范,其卓越品质与高端性能有目共睹。而此次升…...

echarts Y轴展示时间片段,series data数据 也是时间片段,鼠标放上去 提示框显示对应的时间片段
功能要求 1、折线图,展示每天对应的一个时间片段 2、echarts Y轴展示时间片段,如:[00:00,03:00,05:15] 3、X轴展示日期,如:[xx年xx月xx日] 后端返回的数据结构,如 [{xAdate:"2024-06-15",data:…...

20. mediasoup服务器的布署与使用
Mediasoup Demo部署 架构服务分析 服务端提供3个服务: 1.www服务,浏览器通过访问服务器目录获取客户端代码,通过V8引擎,启动底层WebRTC 2.nodejs提供websocket服务和http服务,用于信令交互 3.Mediasoup C提供的流媒体…...

【leetcode--同构字符串】
要求:判断两个字符串的形式是不是一致,即是不是AABC或者ABBBCC这种。 trick:使用set()结合zip()。 set()用法:用于创建一个不包含重复元素的集合 zip&#…...
shell expr功能详解
expr命令可以实现数值运算、数值或字符串比较、字符串匹配、字符串提取、字符串长度计算等功能。它还具个特殊功能,判断变量或参数是否为整数、是否为空、是否为0等。 1.字符串表达式 ------------------------- expr支持模式匹配和字符串操作。字符串表达式的优先…...
java继承Thead类和实现Runnable接口创建线程的区别
一、继承Thread类创建多线程 public class Demo{public static void main(String[] args) {MyThread thread new MyThread();thread.start();}} class MyThread extends Thread{Overridepublic void run() {//子线程执行的操作} }注意:开启子线程要调用start()方法…...
interface Ref<T = any> 这是什么写法?为什么写接口还需要加上<T = any>
问: export interface Ref<T any> { value: T [RefSymbol]: true } 这里既然是interface接口,为什么还有<T any>这是什么意思? 回答: <T any> 中的 <T> 表示这是一个泛型参数,它可以在接口中作为类型的占位符,在实际…...
深入探索 MongoDB GridFS:高效大文件存储与管理的全面指南
GridFS 是 MongoDB 的一个规范,用于存储和检索超过 BSON 文档大小限制(16MB)的文件。与传统的文件系统不同,GridFS 可以将一个大文件分割成多个小块,并存储在 MongoDB 的两个集合中:fs.files 和 fs.chunks。…...

基于CentOS Stream 9平台 安装/卸载 Redis7.0.15
已更正systemctl管理Redis服务问题 1. 官方下载地址 https://redis.io/downloads/#redis-downloads 1.1 下载或上传到/opt/coisini目录下: mkdir /opt/coisini cd /opt/coisini wget https://download.redis.io/releases/redis-7.0.15.tar.gz2. 解压 tar -zxvf re…...

激励-保健理论和公平理论
激励-保健理论 herzberg的激励-保健理论中,保健因素是context of a job,激励因素是content of a job。 context of a job是受组织控制的因素,比如工作条件,基本工资,公司政策等,个人无法支配。content of…...
深入探索 Spring Boot 自定义启动画面
目录 引言什么是 Spring Boot 启动画面Spring Boot 默认启动画面为什么要自定义启动画面如何自定义 Spring Boot 启动画面 修改配置文件使用 Banner 接口通过图片实现启动画面ASCII 艺术画的应用 进阶:基于环境变量的动态 Banner多模块项目中的启动画面Spring Boot…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...