You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala方法执行顺序疑问:main方法外代码为何先执行?

为什么Scala代码中main方法外的代码先执行?

这是个很典型的Scala单例对象初始化顺序问题,我来给你拆解清楚:

首先看你写的代码:

object Maps {
  def main(args: Array[String]): Unit = {
    println("Hello")
  }
  def myMethod(myhash: Map[String, String]) = {
    for ((k, v) <- myhash) printf("key: %s, value: %s\n", k, v)
  }
  myMethod(Map("test1" -> "test2"))
  val m1 = Map[Int, Int](1 -> 1)
  for ((k, v) <- m1) printf("key: %s, value: %s\n", k, v)
}

你提到输出顺序是:

key: test1, value: test2
key: 1, value: 1
Hello

核心原因:Scala单例对象的初始化逻辑

在Scala里,object是单例对象,当JVM启动并加载这个对象的时候,会先执行对象内部所有不在方法里的顶级代码,完成整个单例对象的初始化工作,之后才会去调用main方法作为程序的入口执行。

你代码里的这几部分都是顶级语句(不在任何方法内部):

  • myMethod(Map("test1" -> "test2"))
  • val m1 = Map[Int, Int](1 -> 1) 以及后续的for循环

这些代码会在main方法运行前,随着Maps单例对象的初始化被依次执行。而main方法里的println("Hello")是在整个对象初始化完成后才会被调用的,所以输出顺序才会和你预期的相反。

怎么修改才能让代码按预期顺序执行?

只需要把这些顶级语句移到main方法内部就可以了,修改后的代码如下:

object Maps {
  def main(args: Array[String]): Unit = {
    println("Hello")
    // 把原来的顶级代码移到main方法内
    myMethod(Map("test1" -> "test2"))
    val m1 = Map[Int, Int](1 -> 1)
    for ((k, v) <- m1) printf("key: %s, value: %s\n", k, v)
  }
  def myMethod(myhash: Map[String, String]) = {
    for ((k, v) <- myhash) printf("key: %s, value: %s\n", k, v)
  }
}

这样修改后,程序会先执行main方法里的println("Hello"),再依次执行后面的方法调用和循环,输出顺序就符合你的预期了。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:31:59