Kotlin main函数


main() 函数

来仔细看看 main() 函数。实际上,它就是一个很常见的函数:你可以对它做任何你能对普通函数做的事。唯一的不同是:它是程序的入口点(entry point)。这意味着程序的执行从调用这个函数开始。

我们来拆解一下 main() 的结构:

fun main() {}

代码解释:

  • fun 是关键字,表示我们正在定义一个函数;

  • main 是函数名。这个名字不能改:比如如果你改成 Main(),程序可能会编译成功,但不会运行;

  • 最后是函数体,和其他函数一样,写在 {} 大括号中。

实际上,main() 函数也可以有输入参数 —— args,它并不是必须的,我们稍后会详细讲它。

总之,除了不能改名,main() 就是一个普通函数。

但它最主要的特点是:它必须存在。没有它,程序不会启动。不过,它也可以像其他函数一样被调用,比如它自己调用自己:

var decrease = 3fun main() {if (decrease == 0)returndecrease = decrease - 1println(decrease)main()
}

代码解释:

这个程序中,每次调用 main() 函数都会让全局变量 decrease 减 1,并输出当前的值,直到它变成 0。

“全局变量”表示这个变量在整个程序中都可以访问,包括在 main() 函数内部。

输出结果如下:

2
1
0

main 函数的参数

其实 main() 函数可以有输入参数。它们通常被命名为 args,并保存在一个字符串数组中。语法如下:

fun main(args: Array<String>) {}

代码解释:

使用 args 的方式和普通数组一样,例如:

  • args.size:获取参数个数;

  • args[1]:获取程序的第二个参数。

那它有什么用?

简单来说,main() 函数的参数就是程序运行时传入的数据。你可能见过类似的情景,比如“用某程序打开文件”:这个文件路径就是通过参数传给程序的。

所以,借助 args,我们可以给程序传入外部数据。


命令行与程序参数

我们可以通过 IDE 工具命令行 给程序传入参数。你可能已经知道在 IDE 中该怎么做。命令行的方式稍微复杂点,但非常重要。

掌握命令行技巧对你以后编程的道路大有帮助。比如,它可以避免为程序构建 GUI 界面。


通过命令行传参

要从命令行运行程序,你需要一个已经 编译好的程序

运行命令如下:

$ java -jar filename.jar args

代码解释:

  • filename.jar:是你的程序文件;

  • args:是你传给程序的参数(中间用空格分隔);

示例

以下是一个简单的例子:

fun main(args: Array<String>) {println(args[0])println(args[1])
}

假设你将它保存为 print_args.kt,然后编译成 print_args.jar,运行命令如下:

$ java -jar print_args.jar Hello, Kotlin!

输出结果:

Hello,
Kotlin!

代码执行如下:

println(args[0]) // Hello,
println(args[1]) // Kotlin!

如果你输入参数为 "Love""Kotlin!",输出会变成:

Love
Kotlin!

所以,只通过改变命令行参数,不修改代码,就可以改变程序输出。


有参数?没参数?

main() 函数可以带参数也可以不带参数。来看两个示例:

带参数的:

fun main(args: Array<String>) {val firstName = "Luke"val lastName = "Skywalker"println(firstName + " " + lastName) // Luke Skywalker
}

不带参数的:

fun main() {val firstName = "Luke"val lastName = "Skywalker"println(firstName + " " + lastName) // Luke Skywalker
}

两者都能正常运行。

而且你可以在同一个文件中同时写这两种 main()

fun main(args: Array<String>) {println(args[0]) // Loveprintln(args[1]) // Kotlin!
}fun main() {println("Hello, World!") // 不会被调用
}

程序只会从 main(args: Array<String>) 开始执行。

但是注意:你不能在一个文件中写多个参数一样的 main()。带参数或不带参数的 main() 都只能各写一个。

你也可以写带有其他参数类型的 main(),比如:

fun main(arg: Int) {}
fun main(a: Double, b: String) {}

但这些就只是普通函数了,不会作为程序入口点。

只有 main()main(args: Array<String>) 才能作为程序入口。


总结

  • 程序从 main() 开始执行;

  • 你可以用参数 args 向程序传入数据;

  • 你可以通过命令行或 IDE 设置这些参数;

  • Kotlin 1.3 以后,main() 可以没有参数;

  • 同一个文件只能有一个带参数的 main() 和一个不带参数的 main()

  • 其他写法的 main() 会被当作普通函数,不会自动运行。

现在,你已经学会了使用 main() 和程序参数了。你可以不改代码,仅通过命令行传参就改变程序行为。这是每个程序员都必须掌握的基础技能!

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

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

相关文章

深入理解 Spring:事务管理与事件机制全解析

文章目录前言一、Spring 事务管理&#xff08;Transaction Management&#xff09;1. 使用 Transactional 管理事务2. 核心属性说明3. 事务传播行为详解&#xff08;Propagation&#xff09;4. 异常回滚策略分析5. 底层原理剖析&#xff08;源码级&#xff09;二、Spring 事件机…

AWD练习的平台搭建

ubuntu虚拟机搭建 前提资源准备 进行AWD我们需要在一个独立的虚拟机 现在就来搭建一个ubuntu的 这里我们使用的VMware是17的 然后下载镜像的地址&#xff1a;Ubuntu最全的国内镜像下载地址 - 哔哩哔哩 我下载的是中科大的 这里需要准备的前提资源就有了。 创建Ubuntu虚…

C++ 详谈继承体系下的构造函数和析构函数

前言 前面呢, 我们说了C中实现多态的原理, 其中也说了, 虚函数表和虚函数指针的创建时机, C 详谈多态实现原理-CSDN博客 , 这一节呢, 我们会说说在C中继承体系下的另一个知识点, 那就是: 继承体系下的构造函数和析构函数~~, 主要围绕两个问题: 执行顺序? 虚析构函数的作用? …

PostgreSQL 字段类型速查与 Java 枚举映射

1. 查询 SQLSELECTc.table_schema,c.table_name,c.column_name,c.data_type,c.udt_name,CASE-- 数值WHEN c.udt_name IN (int2,int4,int8,float4,float8,numeric,money)THEN NUMERIC-- 布尔WHEN c.udt_name boolTHEN BOOLEAN-- 日期/时间WHEN c.udt_name IN (date,time,timetz…

数据分析综合应用 30分钟精通计划

🔬 数据分析综合应用 30分钟精通计划(完整版含输出) ⏰ 时间分配 5分钟:数据加载与清洗基础 10分钟:探索性数据分析(EDA) 10分钟:数据分析实战案例 5分钟:分析报告生成 📚 第一部分:数据加载与清洗基础 (5分钟) 1. 模拟真实数据集 import pandas as pd import nu…

Python爬虫实战:研究psd-tools库相关技术

一、引言 1.1 研究背景 Adobe Photoshop 是目前最流行的图像处理软件之一,其原生文件格式 PSD(Photoshop Document)包含了丰富的图像信息和编辑历史。PSD 文件不仅在设计领域广泛使用,还在数字营销、版权保护和安全分析等领域具有重要价值。然而,手动分析大量 PSD 文件是…

基于卷积傅里叶分析网络 (CFAN)的心电图分类的统一时频方法

一、研究背景与核心问题​​ECG分类的挑战​&#xff1a;心电图&#xff08;ECG&#xff09;信号分类在心律失常检测、身份识别等领域至关重要&#xff0c;但传统方法难以同时有效整合时域和频域信息。现有方法包括&#xff1a;​时域分类&#xff08;CNN1D&#xff09;​​&am…

Linux——LinuxOS

cd,pwd,mkdir,rm,ls,touch,cat,echo,

深度学习篇---矩阵

在机械臂解算、深度学习网络等硬件和软件领域中&#xff0c;矩阵运算作为核心数学工具&#xff0c;承担着数据表示、变换、映射和优化的关键作用。以下从具体领域出发&#xff0c;详细总结涉及的矩阵运算及对应的核心知识&#xff1a;一、机械臂解算领域机械臂解算&#xff08;…

元宇宙:技术乌托邦与数字化未来——基于技术哲学的分析

一、技术哲学视域下的元宇宙本质哲学源流与技术基因的双重映射理想世界的千年回响&#xff1a;从柏拉图洞穴隐喻中的影子世界&#xff0c;到普特南“钵中之脑”对虚拟与现实界限的消弭&#xff0c;元宇宙的构想深植于人类对平行世界的永恒追问。中国传统神话中“天人二元结构”…

如何构建一个基于大模型的实时对话3D数字人?

近年来&#xff0c;随着元宇宙和AIGC技术的爆发&#xff0c;3D数字人从影视特效走向日常应用。无论是虚拟主播、AI客服&#xff0c;还是数字教师&#xff0c;其核心诉求都是**“能听、会说、有表情”**的实时交互能力。本文就带大家了解如何构建一个基于大模型的实时对话的3D数…

NULL值处理:索引优化与业务设计实践指南

一、NULL值的本质与影响NULL值在数据库中代表"未知状态"或"不适用"的特殊标记&#xff0c;与空字符串或0有本质区别12。其特性导致以下业务与性能问题&#xff1a;‌语义复杂性‌&#xff1a;NULL可能表示"未填写"(如用户手机号)或"不适用&…

【add vs commit】Git 中的 add 和 commit 之间的区别

关于git add和git commit还有一些有点不太清楚的地方&#xff0c;这里写一篇文章好好理一理git add&#xff1a;添加到暂存区 git add实际上是把工作区中的内容存入“暂存区” 通俗来讲就是告诉Git&#xff1a;“这些文件我准备好commit了” git add file.txt # 添加单个文件 …

【推荐100个unity插件】使用C#或者unity实现爬虫爬取静态网页数据——Html Agility Pack (HAP)库和XPath 语法的使用

文章目录前言一、安装HtmlAgilityPack1、从NuGet下载HtmlAgilityPack包2、获取HtmlAgilityPack.dll二、HtmlAgilityPack常用操作1、加载 HTML2、查询方式2.1 使用 XPath 查询&#xff08;推荐&#xff09;2.2 使用 LINQ 查询3、常用查询操作3.1 选择节点3.2 获取属性值3.3 遍历…

用 urllib 开启爬虫之门:从零掌握网页数据抓取

在数字时代&#xff0c;数据就是力量。作为一名社会工作者&#xff0c;或许你想了解城市服务资源&#xff1b;作为一个编程初学者&#xff0c;你可能希望从网页中自动提取新闻、课程或公开数据。今天&#xff0c;我们就来讲一讲 Python 标准库中的一把“钥匙”——urllib 库&am…

Spring Boot 订单超时自动取消的 3 种主流实现方案

Spring Boot 订单超时自动取消的 3 种主流实现方案关键词&#xff1a;Spring Boot、订单超时、延迟任务、RabbitMQ、Redis、定时任务在电商、外卖、票务等业务中&#xff0c;“下单后若 30 分钟未支付则自动取消”是一道经典需求。实现方式既要保证 实时性&#xff0c;又要在 高…

0401聚类-机器学习-人工智能

文章目录一 无监督学习什么是无监督学习&#xff1f;核心特点&#xff1a;无监督学习的主要类型1. 聚类分析 (Clustering)2. 降维 (Dimensionality Reduction)3. 关联规则学习 (Association Rule Learning)4. 异常检测 (Anomaly Detection)5. 密度估计 (Density Estimation)二 …

基础神经网络模型搭建

nn 包提供通用深度学习网络的模块集合&#xff0c;接收输入张量&#xff0c;计算输出张量&#xff0c;并保存权重。通常使用两种途径搭建 PyTorch 中的模型&#xff1a;nn.Sequential和 nn.Module。 nn.Sequential通过线性层有序组合搭建模型&#xff1b;nn.Module通过__init__…

基于单片机出租车计价器设计

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 本设计实现了一种基于单片机的智能化出租车计价系统。系统以单片机为核心处理器&#xff0c;集成…

134. Java 泛型 - 上限通配符

文章目录134. Java 泛型 - 上限通配符 (? extends T)**1. 什么是上限通配符 (? extends T)&#xff1f;****2. 为什么使用 ? extends T&#xff1f;****3. 示例&#xff1a;使用 ? extends T 进行数据读取****✅ 示例 1&#xff1a;计算数值列表的总和****4. 注意事项&…