【教程】Kotlin语言学习笔记(四)——方法(持续更新)

文首标志
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【Kotlin语言学习】系列文章

第一章 《认识Kotlin》
第二章 《数据类型》
第三章 《数据容器》
第四章 《方法》


文章目录

  • 【Kotlin语言学习】系列文章
  • 一、方法声明
    • (一)普通类
    • (二)静态类
    • (三)伴生类
  • 二、方法参数
    • (一)默认参数
    • (二)具名参数
    • (三)可变参数


在 Kotlin 中,方法(Method) 是用于执行特定任务或操作的一段代码块,它可以包含在类中(成员方法)或者独立存在(扩展方法、顶层函数)。

一、方法声明

方法的声明包括方法名、参数列表、返回类型和方法体。下面是方法声明的语法。

fun 方法名称(参数1: 数据类型1, 参数2: 数据类型2, ...): 返回值数据类型 {// 方法体// 可以包含具体的代码逻辑
}

其中,fun是声明方法的关键字,用于声明这是一个方法;声明这是一个方法后,要填入此方法的参数并定义这些参数的数据类型;然后定义返回值的数据类型,最后设置方法体{}中的实现逻辑。

下面是一个简单的示例。

fun sum(a: Int, b: Int): Int {return a + b
}

在上面的示例中,sum 是方法名,它接受两个 Int 类型的参数 ab,并返回它们的和,返回类型为 Int

(一)普通类

普通类(Class) 是一种用于创建具有一组方法和属性的数据类型,它们可以被实例化为对象并用于存储数据和实现特定的功能。普通类可以包含构造函数、成员变量、成员函数和其他类型的嵌套类等成员。

普通类的方法通常是指成员方法,即定义在类中的方法。普通类的方法声明方式与其他方法相似,但它们是与特定类相关联的。下面是普通类的方法声明的基本语法结构。

class MyClass {fun 方法名(参数1: 数据类型1, 参数2: 数据类型2, ...): 返回值数据类型 {// 方法体// 可以包含具体的代码逻辑}
}

下面是一个简单的示例。

fun main() {// 普通类的成员方法声明与调用// 需要构建出实例对象才能访问成员方法// 构建实例对象只需要只需要在类名后面加上()Person().test()
}class Person(){fun test(){println("成员方法")}
}

以上的代码创建了一个名为Person的普通类,并在这个类中创建了一个叫做test的成员方法,方法体的逻辑就是打印字符串“成员方法”。

需要注意的是,普通类必须创建出实例对象,才能够访问类的成员方法。

(二)静态类

Kotlin 并没有提供静态类的概念。相对地,Kotlin 在采用 Kotlin 单例模式时,使用了伴生对象来解决问题。

单例对象(Singleton Object) 是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点以获取该实例。在 Kotlin 中,实现单例模式非常简单,可以使用 object关键字创建单例对象。

而之所以强调“静态类”这个概念,就是因为在 Kotlin 中,通常将包含一组实用函数或工具方法的类命名为 UtilUtils 即工具类,这些类通常被用来存放各种通用的函数,方法或常量,方便在项目中重复使用——它们往往就是用类似静态类的概念创建一个单例对象,作为静态类。

下面是一个简单的示例。

fun main() {// 静态类中的方法都是静态方法// 不需要构建实例对象,可以直接通过类名访问静态方法NumUtil.double(1)
}// 静态类
object NumUtil {fun double(num: Int): Int {return num * 2}
}

以上的代码创建了一个单例对象(静态类)NumUtil,并在其中创建了一个名为double的方法,令输出结果为输入实参的2倍。

同普通类对比,调用静态类的静态方法不需要构建实例对象,直接通过类名就可以调用方法。

(三)伴生类

结合上面普通类和静态类调用方法的特点,如果想要在创建的是普通类的同时依旧希望直接通过类名来调用方法,就需要使用伴生类。

伴生类(Companion Class) 是一个与其所在的类绑定的内部类,可以通过类名直接访问其内部的成员,而不需要实例化外部类。伴生类常用于创建静态成员或工厂方法。其声明方法需要先创建一个普通类,再在普通类的块中使用companion object关键字创建伴生的对象,

fun main() {// 直接通过类名访问伴生对象中的方法Person.test2()
}// 伴生类
class Person() {// 伴生对象companion object {fun test2() {println("伴生类")}}
}

套用普通类的示例,仍然创建的是名为Person的类,但此时类中由于存在了伴生对象,所以成为了一个伴生类,于是可以像静态类一样通过类名直接访问方法。

二、方法参数

方法参数是用于接收输入值以在方法中进行处理的变量。这些参数可以是必需的参数,也可以是可选的参数,也可以是具有默认值的参数。

在Kotlin中,方法参数通常被分为三种类型:

  • 默认参数
  • 具名参数
  • 可变参数

(一)默认参数

默认参数 指的是对于某些方法参数,本身具有默认值,所以往往在声明中省略。

下面是一个简单的示例。

fun main() {// 默认参数greet("Alice") // 输出 "Hello, Alice!"greet("Bob", "Hey") // 输出 "Hey, Bob!"
}// 方法参数
fun greet(name: String, message: String = "Hello") {println("$message, $name!")
}

从以上的代码可以看到,不同于常规的方法声明,这里greet方法的message参数在确定数据类型为字符串后,使用了=赋值运算符设置了默认值为字符串Hello。此时在调用这个方法时,输入一个值自动识别为未定义默认值的name参数的实参;而只有两个实参都输入时,才能够修改默认参数的值。

(二)具名参数

具名参数 是指使用参数名称来传递参数值的一种方式,在调用函数或方法时可以根据参数名称来为参数赋值,而不必严格按照参数顺序传递参数值。

fun greet(name: String, message: String) {println("$message, $name!")
}
greet(name = "Alice", message = "Hello") // 输出 "Hello, Alice!"
greet("Bob", message = "Hey") // 输出 "Hey, Bob!"

仍旧使用默认参数的示例,可以从代码中看到在输入实参的时候,只需要使用参数 = 的方式就可以通过参数名定位方法中的具体参数进行赋值,此时即便有默认参数,也可以随意输入实参。

(三)可变参数

可变参数(varargs) 允许向方法传递可变数量的参数。通过vararg关键字,可以在方法声明中指定一个参数,该参数允许传递零个或多个值。

以下是简单的示例。

fun printNumbers(vararg numbers: Int) {for (number in numbers) {println(number)}
}// 使用可变参数进行调用
printNumbers(1, 2, 3, 4, 5)

上面代码创建了一个名为printNumbers的方法,相比于普通方法建立形参的方式,这里在numbers参数前使用了varag关键字表示此参数是一个可变参数。可变参数实际上是一组参数,所以可以在方法体中,建立一个for循环,遍历可变参数这个组中的所有参数,打印出传递的实参数字值。

上面代码并没有规定返回值类型,这就代表返回Unit类型(类似于其他语言的void类型)。

此外,当创建一个变量,而如果希望此变量可以直接传入可变参数作为实参,就可以使用展开运算符*将变量直接传入。

fun printNumbers(vararg numbers: Int) {for (number in numbers) {println(number)}
}fun main() {val arr = intArrayOf(1, 2, 3)// 使用展开运算符将数组元素作为参数传递给可变参数printNumbers(*arr)
}

需要注意的是如果可变参数不是最后一个参数,给后面的参数传递值需要使用具名参数的方法。


我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

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

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

相关文章

突发,Anthropic推出突破性Claude 3系列模型,性能超越GPT-4

🦉 AI新闻 🚀 突发,Anthropic推出突破性Claude 3系列模型 摘要:人工智能创业公司Anthropic宣布推出其Claude 3系列大型语言模型,该系列包括Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus三个子模型,旨…

Cesium 自定义Primitive-绘制圆

一、创作来源 1、cesium的entity绘制圆 2、不使用entity的情况下,使用自定义的primitive来动态绘制圆 3、结合上一篇文章的圆,执行动态圆的更新 二、编写步骤 1、创建绘制线的类 包括构造函数、绘图函数以及销毁函数 import { Viewer, ScreenSpaceEven…

docker-compose启动postgres数据库,实现主从备份

文章目录 1. 主库2. 从库3. 测试 1. 主库 创建pg-m 目录,并进入该目录创建docker-compose.yml文件,内容如下: version: "3.1" services:pg_master:image: postgres:15.3container_name: pg_masterenvironment:POSTGRES_PASSWORD:…

Domain Adaptation Vs. Prompt-Tuning:能否用域自适应解决大模型提示学习问题?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者简介 李江梦,中国科学院软件研究所天基综合信息系统全国重点实验室助理研究员 论文简介 今天介绍的是被机器学习领域顶级学术会议ICLR 2024接收的论文:BayesPrompt: Prompting Large…

广东Lenovo SR588服务器维修升级硬盘内存

本案例描述了对联想SR588服务器进行硬件升级的过程,包括更换固态硬盘作为系统盘,以及增加内存容量至128GB。升级后,服务器性能得到显著提升,同时通过重新配置RAID阵列和操作系统的重新安装,确保了系统的稳定性和数据的…

STM32 NAND FLASH知识点

1.NAND FLASH的简介 NAND FLASH 的概念是由东芝公司在 1989 年率先提出,它内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。 NAND FLASH 存储器具有容量较大,改写速度快等优点,适用于大量数据的存储&…

如何利用Flutter来写后端 服务端应用

前言 Flutter是谷歌推出的一款跨平台开发框架,现在属于此领域star最多的框架,其被广泛应用于构建前台界面,但或许很少人知道,他也可以写后端应用。 本文主角 flutter非常著名的getx库推出的get server jonataslaw/get_server:…

实验01-STP+链路聚合+VRRP实验

1.实验拓扑 2 实验需求 根据拓扑图配置IP地址。交换机之间通过STP防环为了防止SW2-SW3之间聚合的高效链路被STP 阻塞,请配置SW2 为网络中的主根,SW3为网络中的备份根桥。通过VRRP实现网关冗余,网关在SW2和SW3上,其中VLAN10的网关…

【3GPP】【核心网】【5G】5G核心网协议解析(一)(超详细)

1. 5G核心网概念 5G核心网是支撑5G移动通信系统的关键组成部分,是实现5G移动通信的重要基础设施,它负责管理和控制移动网络中的各种功能和服务。它提供了丰富的功能和服务,支持高速、低时延、高可靠性的通信体验,并为不同行业和应…

前端监控为什么采用GIF图片做埋点?

一、什么是埋点监控 前端监控是开发人员用来跟踪和维护应用程序表现层的运行状况的过程和工具。它主要包括三种类型:数据监控、性能监控和异常监控。 1、数据监控 主要是为了收集跟用户相关的数据,例如用户设备类型、浏览器版本、页面浏览量(…

GIS之深度学习05:VisualStudio安装教程

在安装CUDA前,建议先安装VisualStudio,以防报错 VisualStudio安装步骤简单,但时间较长。。。。。。 正文开始: VisualStudio官网:Visual Studio: IDE and Code Editor for Software Developers and Teams 点击右上角…

XUbuntu22.04之解决:仓库xxx没有数字签名问题(二百一十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一:增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二:镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…

1905_ARMv7-M的堆栈寄存器

1905_ARMv7-M的堆栈寄存器 全部学习汇总: g_arm_cores: ARM内核的学习笔记 (gitee.com) ARMv7-M实现了2种堆栈,分别是MSP和PSP。复位的时候默认是MSP,而当前是哪种可以通过CONTROL.SPSEL寄存器的bit来查看。 SP寄存器的最低2bit,S…

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

大模型基础应用框架(ReACT\SFT\RAG)创新及零售业务落地

如何将大语言模型的强大能力融入实际业务、产生业务价值,是现在很多公司关注的焦点。在零售场,大模型应用也面临很多挑战。本文分享了京东零售技数中心推出融合Agent、SFT与RAG的大模型基础应用框架,帮助业务完成大模型微调、部署和应用&…

Linux 安装k8s

官网 常见的三种安装k8s方式 1.kubeadm 2.kops:自动化集群制备工具 3.kubespray: 提供了 Ansible Playbook 下面以kubeadm安装k8s kubeadm的安装是通过使用动态链接的二进制文件完成的,目标系统需要提供 glibc ##使用 ss 或者 netstat 检测端…

搞流量,就这点事!

资产还是负债?赚钱之前想明白! 如果说你有一个产品,大概率的情况是,如果产品被更多人看到,那么最终购买的人也会多一些。结果就是,你的利润更多。所以,在产品没问题的情况下,流量越多…

【学习心得】响应数据加密的原理与逆向思路

一、什么是响应数据加密? 响应数据加密是常见的反爬手段的一种,它是指服务器返回的不是明文数据,而是加密后的数据。这种密文数据可以被JS解密进而渲染在浏览器中让人们看到。 它的原理和过程图如下: 二、响应数据加密的逆向思路 …

MATLAB 绘制带填充配色的雷达图--附案例代码

MATLAB 绘制带填充配色的雷达图 目录 MATLAB 绘制带填充配色的雷达图摘要1. 准备数据2. 绘制雷达图3. 设置填充颜色4. 案例代码及结果4. 结语 摘要 在MATLAB 中,可以使用多种方式绘制美观的雷达图。本文将介绍如何通过详细案例和代码说明,在MATLAB中绘制…