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

news2024/9/22 3:42:05

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


【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.coloradmin.cn/o/1488884.html

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

相关文章

openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池

文章目录 openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池235.1 背景信息235.2 前提条件235.3 操作过程235.3.1 创建资源池235.3.2 管理资源池235.3.3 删除资源池 235.4 查看资源池的信息 openGauss学习笔记-235 openGauss性能调优-系…

探索Ubuntu命令行:常见问题与解决方案

一、引言 Ubuntu,作为一款流行的Linux发行版,其命令行界面(CLI)为用户提供了丰富的功能和灵活性。然而,对于新手来说,命令行可能会带来一些挑战。本文将探讨一些在使用Ubuntu命令行时可能遇到的问题及其解决…

Python算法100例-3.1 回文数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展7.巧用字符串技巧 1&#xff0e;问题描述 打印所有不超过n&#xff08;取n<256&#xff09;的其平方具有对称性质的数&#xff08;也称回…

加密与安全_ 凯撒密码

文章目录 Pre概述Code 实现 凯撒密码字母频率分析攻击Code解密凯撒密码 小结 Pre PKI - 02 对称与非对称密钥算法 概述 凯撒密码是一种简单的替换加密技术&#xff0c;也称为移位密码。它是古典密码学中最早的密码之一&#xff0c;得名于古罗马军队领袖凯撒尤利乌斯&#xff…

VMware虚拟机安装Linux

1.新建虚拟机 2. 安装操作系统 等待 选择中文 点软件选择 选择下面的GNOME桌面 禁用KDUMP 点进安装位置&#xff0c;点完成就可以了 网络连接&#xff0c;右上角打开 开始安装&#xff0c;输入ROOT密码&#xff0c;创建用户 点击重启&#xff0c;等待 重启完成之后出现下面的界…

MATLAB环境下基于离散小波变换的心电信号伪影去除及PQRST波检测

可穿戴个人健康监护系统被广泛认为是下一代健康监护技术的核心解决方案。监护设备不断地感知、获取、分析和存储大量人体在日常活动中的生理数据&#xff0c;为人体的健康状况提供必要的、准确的、集成的和长期的评估和反馈。在心电监测领域&#xff0c;可穿戴传感器具有以下应…

镜头畸变模型及去畸变的原理

1. OpenCV去畸变undistortPoints原理解析 Opencv中镜头畸变包含了径向畸变和切向畸变&#xff0c;本章节主要阐述镜头畸变模型以及去畸变的原理。 1.1 镜头畸变模型 参考opencv文档 https://docs.opencv.org/3.1.0/d4/d94/tutorial_camera_calibration.html&#xff0c;opencv…

布隆过滤器实战

一、背景 本篇文章以解决实际需求的问题的角度进行切入&#xff0c;探讨了如果使用布隆过滤器快速丢弃无效请求&#xff0c;降低了系统的负载以及不必要的流量。 我们都知道布隆过滤器是以占用内存小&#xff0c;同时也能够实现快速的过滤从而满足我们的需求&#xff0c;本篇…

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

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

更新至2023年,上市公司ESG数据合集(四份数据:盟浪、华证、商道融绿、富时罗素)

更新至2023年&#xff0c;上市公司ESG数据合集&#xff08;四份数据&#xff1a;盟浪、华证、商道融绿、富时罗素&#xff09; 1、时间&#xff1a; 富时罗素ESG评分&#xff1a;2018-2023年 华证ESG评级&#xff1a;2009-2023年 盟浪ESG评级&#xff1a;2014-2023 商道融…

【Linux】输入系统应用

# 前置知识 (1)输入子系统分为三层&#xff0c;分别是事件处理层、核心层、设备驱动层&#xff1b; (2)鼠标移动、键盘按键按下等输入事件都需要通过设备驱动层→核心层→事件处理层→用户空间&#xff0c;层层上报&#xff0c;直到应用程序; 事件处理层 (1)事情处理层主要是负…

数码管的动态显示(一)

1.原理 把每一个数码管闪烁的时间设置为1ms&#xff0c;肉眼观察不到就会认为6个数码管在同时闪烁。 实验目标&#xff1a; 使用6位8段数码管实现数码管的动态显示&#xff0c;显示的内容就是0-999_999。当计数到最大值&#xff0c;让他归零&#xff0c;然后循环显示。每0.1秒…

【嵌入式移植】8、U-Boot源码分析5—启动过程分析start.S

U-Boot源码分析5—启动过程分析start.S 1、boot0.h2、reset2.1、vectors2.2、ELn2.2.1 EL32.2.2、EL2、EL1 2.3、SMPEN2.3、core errate2.4、lowlevel_init 前面从U-Boot编译的角度分析了其Makefile、链接脚本等&#xff0c;本章开始正式分析U-Boot启动过程 从上一篇文章7、U-…

30天JS挑战(第十六天)----鼠标拖影效果

第十六天挑战(鼠标拖影效果) 地址&#xff1a;https://javascript30.com/ 所有内容均上传至gitee&#xff0c;答案不唯一&#xff0c;仅代表本人思路 中文详解&#xff1a;https://github.com/soyaine/JavaScript30 该详解是Soyaine及其团队整理编撰的&#xff0c;是对源代…

20 个不同的 Python 函数实例

Python 是一种广泛使用的高级编程语言&#xff0c;其函数是 Python 编程中至关重要的概念之一。函数是一段可以重复使用的代码块&#xff0c;可以接收输入参数并返回输出结果。使用函数能够提高代码的可读性、可维护性和重用性。 基础知识 在 Python 中&#xff0c;函数使用关…

[动态规划]---part1

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

LeetCode-02

225. 用队列实现栈 用两个队列实现栈的功能&#xff0c;思路如下&#xff1a; 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列&#xff0c;直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…

thymeleaf 一个莫名其妙的错误提示 org.attoparser.ParseException

thymeleaf 一个莫名其妙的错误提示 介绍 开发过程中遇到一个莫名奇妙的错误&#xff0c;一时竟然不知道怎么解决&#xff0c;找官网也没有找到 问题 页面显示 错误日志 org.attoparser.ParseException: (Line 96, Column 5) Malformed markup: Attribute “}” appears m…

医学大数据|统计基础|医学统计学(笔记):开学说明与目录

开始学习统计基础&#xff0c;参考教材&#xff1a;医学统计学第五版 点点关注一切来学习吧 责任编辑&#xff1a;医学大数据刘刘老师&#xff1a;头部医疗大数据公司医学科学部研究员 邮箱&#xff1a;897282268qq.com 久菜盒子工作室 我们是&#xff1a;985硕博/美国全奖…

【开源】SpringBoot框架开发数据可视化的智慧河南大屏

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏&#xff0c;包含了GDP、…