11:kotlin 类和对象 -- 普通类

前面粗咯的讲了类,这篇详细介绍类及相关的概念

定义类使用关键字class

class Person { /*...*/ }

类声明由类名类头(指定其类型参数、主构造函数等)和由{}包围的类体组成。类头和类体都是可选的;如果类没有体,可以省略{}

class Empty

构造函数(Constructors)

kotlin中,一个类有一个主构造函数零个或多个次构造函数。主构造函数在类头中声明,它位于类名和可选类型参数之后

class Person constructor(firstName: String) { /*...*/ }

如果主构造函数没有任何注解或可见性修饰符,可以省略constructor关键字

class Person(firstName: String) { /*...*/ }

主构造函数在类头中初始化类实例及其属性。类头不能包含任何可运行的代码。如果你想在创建对象时运行一些代码,可以在类体内使用初始化块。初始化块是用init关键字声明的,后面跟着花括号。在花括号内编写你想要运行的任何代码

在实例初始化期间,初始化块按照它们在类体中出现的顺序执行,与属性初始化器交错

class InitOrderDemo(name: String) {val firstProperty = "第一个属性: $name".also(::println)init {println("第一个init块 $name")}val secondProperty = "第二个属性: ${name.length}".also(::println)init {println("第二个init块 ${name.length}")}
}
fun main(){InitOrderDemo("张三")
//    第一个属性 张三
//    第一个init块 张三 
//    第二个属性: 2
//    第二个init块 2
}

主构造函数的参数可以在初始化块中使用。它们也可以在类体中声明的属性初始化中使用

class Customer(name: String) {val customerKey = name.uppercase()
}

kotlin有一种简洁的语法,用于声明属性并从主构造函数中初始化它们,声明也可以包括类属性的默认值

class Person(val firstName: String, val lastName: String, var isEmployed: Boolean = true)

就像常规属性一样,主构造函数中声明的属性可以是可变的var或只读的val

如果构造函数有注解或可见性修饰符,constructor关键字是必需的,修饰符位于它之前

class Customer public @Inject constructor(name: String) { /*...*/ }

次构造函数

一个类也可以声明次要构造函数,它们以constructor为前缀

class Person(val pets: MutableList<Pet> = mutableListOf())class Pet {constructor(owner: Person) {owner.pets.add(this)}
}

如果类有主构造函数,则每个次要构造函数都需要直接间接地通过另一个次要构造函数将其委托给主构造函数。使用this关键字完成对同一类的另一个构造函数的委托

class Person(val name: String) {val children: MutableList<Person> = mutableListOf()constructor(name: String, parent: Person) : this(name) {    // 委托主构造函数parent.children.add(this)}
}

初始化块中的代码实际上成为主构造函数的一部分。在访问次要构造函数的第一条语句时,将委托给主构造函数,因此在次要构造函数的主体之前执行所有初始化块和属性初始化器中的代码

即使类没有主构造函数,委托仍然会隐式发生,并且仍会执行初始化块

class Constructors {init {println("Init block")}constructor(i: Int) {println("Constructor $i")}
}fun main(){Constructors(1)
}
//    Init block
//    Constructor 1

如果没有定义任何构造函数,则会自动生成一个public修饰的无参主构造函数

如果不想要有一个public修饰的无参构造函数,需要手动定义一个private修饰的构造函数

class DontCreateMe private constructor(){
}fun main(){val dontCreateMe = DontCreateMe()  // 报错 - Cannot access '<init>': it is private in 'DontCreateMe'
}

当所有主构造函数参数都具有默认值时,在JVM上,编译器将生成一个额外的无参数构造函数,该构造函数将使用默认值。这使得使用Kotlin与创建通过无参数构造函数的类实例的库(例如Jackson或JPA)更容易。

class Customer(val customerName: String = "")

创建类实例

创建一个实例像调用一个方法一样简单

class Customer(var username: String) {
}fun main() {val customer = Customer("Joe Smith")
}

kotlin中创建实例不需要new

类成员

  • 构造函数和初始化块Constructors and initializer blocks
  • 方法Functions
  • 属性Properties
  • 嵌套类和内部类Nested and inner classes
  • 对象声明Object declarations

继承

下篇文章讲解

抽象类

使用abstract关键字定义一个抽象类以及所有或者部分类成员,抽象成员在类中没有被实现

abstract class Polygon {abstract fun draw() // 未实现的方法
}class Rectangle : Polygon() {   // 继承Polygon类,实现deaw方法override fun draw() {// 方法实现}
}

如果是一个非抽象类或者方法,如果想要被重写或者继承,则需要使用open关键字修饰

open class Polygon {open fun draw() {// some default polygon drawing method}
}abstract class WildShape : Polygon() {abstract override fun draw()
}

抽象方法可以重新非抽象方法

伴生对象

在没有类实例的情况下,通过类名调用该类内部对象声明的成员,可以定义伴生对象实现

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

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

相关文章

vue.draggable拖拽——岗位切换如何判断?

有一个业务场景&#xff1a;把一个单位的某个岗位的人&#xff0c;从某某市A岗位调离出来后&#xff0c;又拖拽回去&#xff0c;如果是回到某某市A岗位&#xff0c;则没有变化&#xff0c;若是换了岗位&#xff0c;则会把色块变成红色&#xff0c;表示岗位的变化。 方法一&…

Maven 介绍

文章目录 什么是 maven为什么要选择mavenmaven 仓库什么是maven中央仓库什么是maven本地仓库 idea如何创建出maven项目如何引入第三方库依赖配置国内源 下载 Maven Helper 插件查看各个项目之间的依赖关系 什么是 maven Maven是 Apache 下的一个纯 Java 开发的开源项目&#x…

DDD 系统间的七种关系梳理与实践

系统间的七种关系 本节将根据耦合度从高到低逐一探讨这些关系。耦合度高有时并不是坏事&#xff0c;它能够让团队内部的系统更加内聚&#xff0c;而不是无法整合的碎块。我们应该根据具体情况进行选择。 因为系统间关系往往也是组织架构的反映&#xff0c;此处每种关系除了描…

超卓航科聚国内外专家学者,共推冷喷涂技术的发展与应用

11月24日——26日&#xff0c;冷喷涂技术及其在增材制造中的应用专题会在襄阳召开&#xff0c;来自国内外200多名科技工作者齐聚一堂&#xff0c;共同交流冷喷涂技术的研究与应用。 本次专题研讨会由中国机械工程学会表面工程分会主办&#xff0c;湖北超卓航空科技股份有限公司…

【EasyExcel实践】导出多个sheet到多个excel文件,并压缩到一个zip文件

文章目录 前言正文一、项目依赖二、封装表格实体和Sheet实体2.1 表格实体2.2 Sheet实体 三、核心实现3.1 核心实现之导出为输出流3.2 web导出3.3 导出为字节数组 四、调试4.1 构建调试用的实体类4.2 控制器调用4.3 测试结果 五、注册大数转换器&#xff0c;长度大于15时&#x…

webGL开发虚拟实验室

开发虚拟实验室是一个具有挑战性但也非常有趣和有价值的任务。通过 WebGL&#xff0c;你可以创建交互式、沉浸式的虚拟实验室&#xff0c;使用户能够进行实验和学习。以下是一些步骤和关键考虑因素&#xff0c;帮助你开始开发虚拟实验室&#xff0c;希望对大家有所帮助。北京木…

Unity 通过代码控制Texture进行缩放

在实际应用开发中&#xff0c;有时候需要通过代码对Texture进行缩放。 有两个方法&#xff0c;一个是通过控制宽高进行缩放&#xff0c;另一个是通过比例值进行等比例缩放。 1、控制宽高的方法&#xff1a; /// <summary>/// 纹理缩放方法一&#xff0c;指定宽高/// &…

游戏开发原画的设计方法

游戏原画设计是游戏开发中至关重要的一环&#xff0c;因为它直接影响到游戏的视觉吸引力和用户体验。以下是一些常见的游戏原画设计方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 理解游戏概念&…

如何在Python中操作Redis数据库

目录 一、安装redis-py库 二、连接Redis数据库 三、执行操作 1、设置和获取键值对 2、删除键值对 3、获取列表数据 四、处理数据 1、使用哈希表&#xff08;Hash&#xff09;处理关联数据 2、使用列表&#xff08;List&#xff09;处理有序数据 3、使用集合&#xff…

XIAO ESP32S3之AI应用

一、XIAO ESP32S3 AI应用示例 包含 ChatGPT语音助手、关键字识别等 英文:https://wiki.seeedstudio.com/xiao_esp32s3_speech2chatgpt/ 中文:SenseCraft 模型助手部署 | Seeed Studio Wiki 二、XIAO开发板TinyML项目展示 各种XIAO开发板基于Tiny ML的演示项目:XIAO 系列教…

链接共享平台LinkStack

什么是 LinkStack &#xff1f; LinkStack 是一个独特的平台&#xff0c;为在线管理和共享链接提供了高效的解决方案。平台提供了一个类似于 Linktree 的网站&#xff0c;它可以让用户克服社交媒体平台上只能添加一个链接的限制。借助 LinkStack&#xff0c;用户可以轻松链接到…

Jetson AGX XAVIER刷机时提示invalid_request - Authorization flow not allowed

我下的版本是sdkmanager_1.9.2-10899_amd64.deb&#xff0c;安装后后直接在terminal输入 sdkmanager&#xff0c;出来后提示登录有问题&#xff0c;跳到浏览器链接 http://localhost:8080/?error_descriptionAuthorizationflownotallowed&statehttp://localhost:41369&a…

shell_exec 和 exec区别

shell_exec 和 exec 都是用于在 PHP 中执行系统命令的函数&#xff0c;但它们之间有一些区别。 返回值类型&#xff1a;shell_exec 函数返回命令的输出结果作为字符串&#xff0c;而 exec 函数将输出结果存储在数组中。 输出结果&#xff1a;shell_exec 函数返回命令的完整输出…

录音模块:WT588FM01高性能录音语音芯片IC,功能丰富,音质卓越,满足多样化需求

在音频市场日益繁荣的今天&#xff0c;用户对于录音模块的需求也日益多样化。唯创知音针对这一市场趋势&#xff0c;推出了高性能录音语音芯片模块WT588FM01。凭借其远距离录音、优质音质以及多样化的功能&#xff0c;它成为了众多电子产品中的首选之一。 WT588FM01是深圳唯创…

8 有损压缩的.jpg图片文件格式详解,解封装拆包

有损压缩的.jpg文件 作者将狼才鲸创建日期2023-11-28 1&#xff09;简述 JPEG文件描述 JPEG协议格式分为JPEG、渐进式JPEG&#xff08;图片先显示一部分再显示全部&#xff09;、JPEG2000&#xff08;压缩品质更好&#xff0c;压缩率更高&#xff09;压缩模式&#xff1a;顺序…

苹果mac屏幕投屏镜像工具AirServer2024

airserver 是什么软件&#xff1f;AirServer 是一款 Airplay Mac屏幕镜像应用&#xff0c;AirServer可以通过 mac 实时接收iPhone、iPad以及Android设备的实时屏幕画面。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器。在您的大屏幕上启用 AirServer …

Databend 开源周报第 121 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持追加流 Da…

11月27日,每日信息差

今天是2023年11月27日&#xff0c;以下是为您准备的20条信息差 第一、阿里达摩院AI突破胰腺癌早筛难题。通过平扫CT&#xff0c;在2万多真实世界连续病人群体中发现了31例临床漏诊病变&#xff0c;其中2例早期胰腺癌病患已完成手术治愈 第二、丰田汽车将于11月29日恢复丰田车…

python之pyqt专栏7-信号与槽3

在上一篇文章中python之pyqt专栏6-信号与槽2-CSDN博客中&#xff0c;我们可以了解到对象可以使用内置信号&#xff0c;这些信号来自于类定义或者继承过来的。我们可以对这些信号可以通过connect连接槽函数。 需求 现在有一个需求&#xff0c;有两个UI界面“untitled.ui”和“u…

深度解析异常值在数据分析中的重要性与应对策略

写在前面 在数据分析的过程中&#xff0c;异常值的存在常常是一个需要认真对待的问题。异常值可能影响分析的准确性&#xff0c;导致误导性的结论。本文将深入探讨以下异常值的应对策略&#xff0c;旨在为数据科学家们提供全面、易读、严谨的一些建议。 1.什么是异常值 异常…