【Kotlin 二】函数/高阶函数/内联函数 对象/主构造函数/次要构造函数/对象初始化

1.函数

函数声明如下:

fun 函数名称([函数参数...]): 返回值类型{// 方法体
}fun sum(num1: Int, num2: Int): Int {return num1 + num2
}

注意:Kotlin函数返回值为空时为Unit,并非常见的void

函数可以设置默认值:

fun printNum(numA: Int = 10, numB: Int = 20): Int{println(numA + numB)
}

函数入参默认为val(常量),不支持在方法体中修改

1.1 常用的库函数

println:输出一行

readln:接收一行

pow:取次方

1.2 高阶函数

一个函数如果入参类型 or 返回值类型是函数,那么这个函数就是一个高阶函数

一个变量可以有各种各样的类型(Int/String/…),函数当然也会有自己的类型

对于下面的函数,(String) -> Int就是该函数的类型。函数类型其实就是将函数的入参和返回值抽象出来。

fun test(str: (String)): Int {return str.toInt()
}

1.2.1 变量接收函数(声明)

Kotlin支持将函数赋给一个变量,与Java不同的是格式上有所区别

// func1为一个能够表示函数的变量,该函数接收一个Int作为入参,没有返回值
var func1: (Int) -> Unit

既然Kotlin已经能够使用变量接收函数了,那么必然就能使用函数A作为函数B的形参

// test作为一个函数,能够接受另一个函数的返回值作为入参
// 形参函数的入参事String,返回值是一个Int
fun test(num1: (String) -> Int) {}

1.2.2 变量接收函数(赋值)

对于已有函数,可以使用::获取函数引用

fun main() {var func: (String) -> Int = ::testprintln(func("1"))
}fun test(str: (String)): Int {return str.toInt()
}

也可以直接写匿名函数:

fun main() {var func: (String) -> Int = fun(str: String): Int {return str.toInt()} 
}

匿名函数还有一种更简洁的写法(项目中绝大多数采用这种Lambda表达式来调用高阶函数):

fun main() {var func: (String, String) -> Unit = { str1: String, str2: String ->println(str1 + str2)}func("a", "1")
}
// 输出
a1

因为Kotlin有匿名推断机制,所以lambda入参类型可以去掉

fun main() {var func: (String, String) -> Unit = { str1, str2 ->println(str1 + str2)}func("a", "1")
}

在lambda表达式只有一个入参的情况时,无需显式写明入参,在函数体内可以直接使用it来代替入参

val func1: (Int) -> Unit = {println(it)}

1.4 内联函数

类似于C++,Kotlin使用inline声明一个内联函数。内联函数在编译时会被编译器直接替换到调用该方法的地方

fun main() {test()
}inline fun test() {println("111")
}// 内联函数替换后
fun main() {println("111")
}

2.对象

2.1 主构造函数

一个类可以有多个构造函数,直接写在类名后的是主构造函数。这种形式可以写上默认值,也可以不写

class Student constructor(var name: String, var age: Int) {}

也可以将类属性放在类体中,类似于Java,但是这种形式要求必须写上默认值

class Student () {var name: String = ""var age: Int = 0
}

还有一种形式是以上两种形式结合起来,下面这种方法能够自定义getter和setter

class Student (name: String, age: Int) {var name: String = nameget() = fieldset(value) {field = value + "1"}var age: Int = ageget() = fieldset(value) {field = value * 10}
}

和Java一样,如果没有规定主构造函数,那么Kotlin会为当前类生成一个无参的默认构造函数;如果规定了主构造函数,那么就不会再有默认的无参构造函数

2.2 次要构造函数

次要构造函数还是需要使用this()来调用主构造函数。次要构造函数可以有自己的函数体

class Student (var name: String, var age: Int) {constructor(name: String): this(name, 0) {// 次要构造函数体}
}

2.3 对象的初始化

因为主构造函数没有函数体,想在对象初始化阶段进行操作时,可以使用init块

class Student (var name: String, var age: Int) {init {println(name + "出生了")}
}

2.4 初始化顺序

当执行一个对象的构造函数时,对应的初始化顺序如下:

  1. init代码块
  2. 主构造函数(如果没有会执行默认的无参构造函数)
  3. 次要构造函数

2.5 空值和空类型

Kotlin默认所有的类型都是非空类型,即编译阶段就可以避免出现变量被赋值为null的情况出现

如果真的需要将某个变量在初始化情况下使用null而不是某个具体的对象,需要在类型名称后加一个?将该变量声明为可空类型

fun main() {val student: String? = null
}

Kotlin提供了一种安全的空类型操作:如果想要安全地访问可能包含null值的对象的属性,可以使用安全调用运算符?.

如果对象属性为null则返回null

如果想在可空变量实际为null时返回一个指定的结果,可以使用?:

fun main() {var student: Student? = nullvar studentName: String = student?.name ?: "name"println(studentName)
}

2.6 访问控制权限

Kotlin有4种访问控制权限:public/internal/protected/private

其中internal是Java所没有的。如果使用了internal修饰符,他将在当前的项目中可以随意访问,权限等同于public,但是如果别人引用我们的项目,别人无法使用被修饰的东西

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

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

相关文章

【量算分析工具-水平距离】GeoServer改造Springboot番外系列四

【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…

常用图像分类预训练模型大小及准确度比较

近年来,深度学习技术的发展使得图像分类任务变得越来越容易。预训练模型的出现更是使得图像分类任务变得更加简单和高效。然而,随着预训练模型的数量和大小的增加,我们需要了解每个模型的特点和优缺点,以便更好地选择和使用它们。…

6岁开始学习打字,10岁学懂文字编程

​你们有没有想过打字速度会影响Coding 编程能力? 疫情期间,全国中小学均不定期停止面授课程,改为网上教学。顷刻之间,电脑、智能手机等即时通讯软件成为每日学习的「良师益友」,常伴左右。 同时,学生也由…

实施阶段(2024年5月)

本次探究主要围绕数学问题“斐波拉契数列”项目展开,在一题两解的算法设计过程中,对比经典算法中的迭代和递归,深入解析两者的关系,并在此基础上进行其他数学问题的深入研究。 (1)迭代法也称为辗转法&…

http和https分别是什么?区别是什么?

HTTP和HTTPS是两种常见的网络协议,用于在Web上进行数据传输。以下是它们的简要解释和主要区别: HTTP(Hypertext Transfer Protocol) HTTP是一种应用层协议,用于在Web上传输数据。它是互联网上应用最为广泛的一种网络…

20212313 2023-2024-2 《移动平台开发与实践》第5次作业

20212313 2023-2024-2 《移动平台开发与实践》第5次作业 1.实验内容 设计并开发一个地图应用系统。 该实验需提前申请百度API Key,调用接口实现百度地图的定位功能、地图添加覆盖物和显示文本信息。 2.实验过程 2.1 获取SHA1 (1)打开控制台…

PostgreSQL数据库提权

前面讲述了mysql、SqlServer、Redis数据库相关的提权方式,有兴趣的也可以去看看。 这里讲的postgreSQL数据库提权就是任意命令执行漏洞(CVE-2019-9193)。 目录 数据库简介 漏洞原理 影响版本 漏洞利用 利用前提 漏洞复现 复现准备 复现过程 漏洞修复 数据…

三分钟轻松搞定内容,2024视频号最新AI自动生成影视解说,,百分之百过原创, 月入1万+

在这个数字时代,我们有幸见证了AI技术对创新的推动。现如今,一个崭新的平台出现了,它能让你用AI软件在短短3分钟内制作完成一段影视解说,而且由于这个平台尚属于新兴,竞争者稀少,提供了一个广阔的机遇天地。…

Mysqldump备份与恢复Mysql全部数据库的数据

博主使用docker安装的mysql,现在需要迁移全部的mysql数据库,使用其他工具时,可能导致接口不通(mysql8.4与mysql8.0就不通),使用mysqldump原生工具进行迁移: 全部数据库的数据备份 mysqldump -…

爬虫利器Frida RPC入门——夜神模拟器环境篇

Frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。 frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。frida上层接口支持js、python、…

【MySQL数据库】存储过程实战——图书借阅系统

图书借阅归还 借阅不用count判断,归还不用具体字段值判断 每次借阅或者归还只能操作1本 数据准备 -- 创建数据库 create database db_test3 CHARACTER SET utf8 COLLATE utf8_general_ci; -- 使用数据库 use db_test3; -- 创建图书信息表: create tabl…

鸿蒙高级题库

判断题 1、云函数打包完成后,需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用 (错) 2、在column和Row容器组件中,aligntems用于设置子组件在主轴方向上的对齐格式,justifycontent用于设置子组件在交…

帆软生成csv文件

帆软官网提供了导出csv文件的插件,需要下载指定版本的插件 请选择具体的详情点击官网介绍:文档介绍 插件地址:插件地址

免费分享一套SpringBoot+Vue企业客户关系CRM管理系统【论文+源码+SQL脚本+PPT】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue企业客户关系CRM管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue企业客户关系CRM管理系统系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue企业客户关系CRM管…

表空间[MAIN]处于脱机状态

达梦数据库还原后&#xff0c;访问数据库报错&#xff1a;表空间[MAIN]处于脱机状态 解决方法&#xff1a; 1&#xff1a;检查备份文件 DMRMAN 中使用 CHECK 命令对备份集进行校验&#xff0c;校验备份集是否存在及合法。 ##语法&#xff1a;CHECK BACKUPSET <备份集目录…

Linux IO模型深度解析与实战应用

linux的5种IO模型 一、这里IO是什么 操作系统设有用户态与内核态,确保系统安全。应用程序默认在用户态运行,而执行如IO操作等底层任务时,需切换至内核态以高效执行。 服务器从网络接收的大致流程如下: 1、数据通过计算机网络来到了网卡 2、把网卡的数据读取到 socket 缓…

【CSS】input宽度根据内容自适应

目标&#xff1a;纯css实现以下功能 input 设置width:min-content | max-content&#xff1b;//无效 ∵ 文本输入框通常会被浏览器渲染为具有固定宽度的控件。 解决方法&#xff1a;设置input的宽高都为100%&#xff0c;让它随着父元素的宽高改变。 父元素如何改变呢&#xf…

企企通入选第一新声《2024年中国CIO数字化产品选型白皮书》供应链数字产品可信名录

近日&#xff0c;第一新声研究院根据多年产业数字化研究&#xff0c;历经近半年时间&#xff0c;并综合近200位CIO调研与推荐意见&#xff0c;发布《2024年中国CIO数字化产品选型白皮书》&#xff0c;并推出企业CIO选型指南及可信产品名录。企企通凭借其优秀的采购数字化与供应…

让全世界都能使用你的代码:Python 模块上传 PyPI 全攻略(一步步带你发布自己的 Python 模块到 PyPI)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PyPI 发布教程 📒📝 什么是 PyPI📝 模块的结构和必备文件📝 打包你的模块📝 上传到 PyPI📝 配置 PyPI 账号📝 解决常见问题⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾经想过,自己写的 Python 模块也能发布到 Py…

【乐吾乐3D可视化组态编辑器】模型类型与属性

编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 本章主要为您介绍模型的属性功能。 一个模型至少会包含一个节点&#xff08;Node&#xff09;&#xff0c;从节点类型上可以分为转换节点&#xff08;TransformNode&#xff09;、网格&#xff08;Mesh&#xff09;、实例网…