【教程】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,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白跟做江科大51单片机之AD/DA

1.看原理图找接口 2.看时序图编写读取数据代码 XPT2046.c代码 #include <REGX52.H> //引脚定义 sbit XPY2046_DINP3^4; sbit XPY2046_CSP3^5; sbit XPY2046_DCLKP3^6; sbit XPY2046_DOUTP3^7; unsigned int XPT2046_ReadAD(unsigned char Command) { unsigned char …

多多关键字API php java Python

多多关键字API接口广泛应用于商家进行市场分析、竞品分析、关键词优化等场景。商家可以通过分析关键词数据&#xff0c;了解用户需求&#xff0c;制定针对性的营销策略&#xff0c;提高产品的曝光率和转化率。 多多-item_seach-通过关键字搜索商品列表 公共参数 获取key和秘钥…

开发知识点-C++之win32与NT内核

win32 Windows MFC编程 常用API汇总EnumWindows()函数UpdateData()函数static与 单例 设计模式函数原型:BOOL WINAPI SetConsoleTitle(__in LPCTSTR lpConsoleTitle);HWND 是一个基本类型 表示窗口句柄FindWindow函数SendMessage函数 将指定的消息发送到一个或多个窗口PostMes…

百度地图城市点位数据下载并转换

概述 在浏览百度地图开放平台的时候&#xff0c;发现有个资源下载页面&#xff0c;里面有个城市中心点位和百度地图行政区划adcode映射表数据&#xff0c;这是一个经常使用到的数据&#xff0c;本文实现将这个数据转换为geojson&#xff0c;并借助QGIS转换为经纬度坐标或火星坐…

手写简易操作系统(一)--环境配置

本专栏是我新开设的一个学术专栏&#xff0c;旨在全面介绍手写操作系统的相关内容。其中包括实模式向保护模式的过渡、锁机制、信号量操作、内存分配、硬盘驱动、文件系统、简单shell和管道等操作系统核心知识。该专栏旨在为有意开发自己操作系统的研究人员提供指导与帮助。作为…

代码随想录刷题笔记-Day31

1. 分发饼干 455. 分发饼干https://leetcode.cn/problems/assign-cookies/ 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口…

园区内部无线语音通信的解决方案

在一些园区、办公环境和厂矿场所&#xff0c;内部无线语音通信功能的需求日益凸显&#xff0c;尤其对于人员流动和移动办公的场景。这种需求着重强调了无线通信的便捷性和内部部署环境的适应性。 传统的内部通信系统中&#xff0c;有线通信能力占据主导地位&#xff0c;如集团…

【Latex】图片排版归纳(单张、两张图片并排、三张图片并排)

文章目录 单张图片两张并排三张并排 单张图片 \begin{figure}[htb]\centering\caption{PWM原理图}\includegraphics[width0.45\textwidth]{images/PWM.png}%可修改0.45为其他比例&#xff0c;调整大小 \end{figure}两张并排 实现效果如下 \begin{figure}[htb]\begin{minipag…

Qt初识 - 编写Hello World的两种方式 | 对象树

目录 一、通过图形化方式&#xff0c;在界面上创建出一个控件 二、通过代码方式&#xff0c;创建Hello World 三、Qt 内存泄漏问题 (一) 对象树 一、通过图形化方式&#xff0c;在界面上创建出一个控件 创建项目后&#xff0c;打开双击forms文件夹中的ui文件&#xff0c;可…

托管服务器常见的问题有哪些(常见托管问题解决)

​  对于我们来说&#xff0c;选择一个合适的服务器托管提供商只是建立和管理自己所属网站的第一步。相对来说&#xff0c;真正的挑战在于解决管理网站运行时可能出现的各种问题。就像有时&#xff0c;有些常见的服务器托管问题是不可避免的&#xff0c;但通过主动监控、定期…

统信操作系统安装Docker

1操作系统信息 2 当前系统预装了Docker相关文件&#xff0c;因此以下两个步骤无需操作&#xff1a; 1.安装环境 yum install -y yum-utils 2.设置镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 仓库地址默认是国外的&…

Matlab|基于目标级联法的微网群多主体分布式优化调度

目录 主要内容 1.1 上层微网群模型 1.2 下层微网模型 部分程序 实现效果 下载链接 主要内容 本文复现《基于目标级联法的微网群多主体分布式优化调度》文献的目标级联部分&#xff0c; 建立微网群系统的两级递阶优化调度模型: 上层是微网群能量调度中心优化调度…

python爬虫(3)

上一次的代码结果如下&#xff1a; 当然会有一点点不一样是正常的表现&#xff0c;因为这个图本身使用随机数rand函数做的&#xff0c;用其他两种随机函数出来的结果也不会完全相同。 继上节这次带来的是数组的重塑和转置 1、一维数组的重塑 在NumPy模块中的reshape()函数可…

黑马点评-附近商户实现

GEO数据结构 Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;根据经纬度来检索数据。 GEO本质上是基于sortedSet实现的&#xff0c;在Sorted Set中&#xff0c;每个成员都是与一个分数(score)相关联的&#xff0c;这个分数用于对成员进行排序…

LeetCode-102.题: 二叉树的层序遍历(原创)

【题目描述】 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 【题目链接…

如何将任何文本转换为概念图(GC)

原文地址&#xff1a;how-to-convert-any-text-into-a-graph-of-concepts 使用 Mistral 7B 将任何文本语料库转换为知识图的方法 2023 年 11 月 10 日 使用递归 RAG 方法来实现具有多跳推理的 QnA&#xff0c;以回答基于大型文本语料库的复杂查询。 知识图增强生成与递归 R…

goby的安装和使用

简介 Goby是一款基于网络空间测绘技术的新一代网络安全工具&#xff0c;它通过给目标网络建立完整的资产知识库&#xff0c;进行网络安全事件应急与漏洞应急。 Goby可提供最全面的资产识别&#xff0c;目前预置了超过10万种规则识别引擎&#xff0c;能够针对硬件设备和软件业…

深入探索Docker数据卷:实现容器持久化存储的完美方案(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker入门到精通》 《k8s入门到实战》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 四、Docker数据卷的高级管理 1、数据卷的生命周期管理 2、数据…

2001-2022年上市公司利润表数据

2001-2022年上市公司利润表数据 1、时间&#xff1a;2001.12.31-2022.12.31 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、统计截止日期、报表类型、投资收益、其中&#xff1a;对联营企业和合营企业的投资收益、公允价值变动收益、营业利润、其他综…

网关数据采集解决方案-天拓四方

随着物联网技术的快速发展&#xff0c;数据采集已成为企业运营、管理和决策的重要支撑。网关作为连接不同网络的关键设备&#xff0c;其在数据采集过程中发挥着至关重要的作用。本文将详细介绍一种网关数据采集解决方案&#xff0c;旨在确保数据采集的高效性、准确性和安全性。…