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()
和程序參數了。你可以不改代碼,僅通過命令行傳參就改變程序行為。這是每個程序員都必須掌握的基礎技能!