scala类中的语句

scala类中的语句,scala,Scala,除了方法和字段之外,您还可以直接将语句放入scala类中,如下所示: class printHelloWorld { val x = 1 println("Hello World") val y = 2 } object callHelloWrold extends App { val helloWorldObj = new printHelloWorld } “Hello World”在创建新对象时打印。这种语句在scala中称为什么?该语句是在类构造函数和valx=1之后

除了方法和字段之外,您还可以直接将语句放入scala类中,如下所示:

class printHelloWorld {
  val x = 1
  println("Hello World")
  val y = 2
}

object callHelloWrold extends App {
  val helloWorldObj = new printHelloWorld
}

“Hello World”在创建新对象时打印。这种语句在scala中称为什么?该语句是在类构造函数和
valx=1
之后调用的,但在
valy=2
之前调用的吗?如果是,编译器是如何做到这一点的?它是否创建了一个包含所有这些语句的匿名方法?

x的定义、println和y的定义都是您定义的类的主构造函数中的语句。x和y是可以在创建的新对象上访问的成员变量。有关交错def、val和PRINTLN的一些示例,请参阅下面的repl会话

Welcome to the Ammonite Repl 1.0.0-RC7
(Scala 2.12.2 Java 1.8.0_77)
If you like Ammonite, please support our development at www.patreon.com/lihaoyi
mshelton-mshelton@ class Test {
                   val x = 1
                   def a = 5
                   println("defs and vals and constructors and oh my")
                   val z = 3
                   def g(): Unit = {println("sup")}
                   }
defined class Test
mshelton-mshelton@ val test = new Test()
defs and vals and constructors and oh my
test: Test = ammonite.$sess.cmd0$Test@743d0d44
mshelton-mshelton@ test.g()
sup

mshelton-mshelton@ test.a
res3: Int = 5
mshelton-mshelton@ test.x
res4: Int = 1
mshelton-mshelton@

不完全是“匿名方法”,但很接近。它是类的构造函数。我在上找到一篇文章,似乎整个类体都被称为类的主构造函数。但是如果你在类主体中定义了一个方法,它是否也会包含在主构造函数中?是的,每一个实例化都会构造所有的东西。如果您有应该是“静态”的成员数据/方法,那么它们应该放在类的伴生对象中。如果您在valx行和valy行之间定义了一些方法,它们是否也包含在主构造函数中?或者编译器只会选择那些行并将它们放入构造函数中,然后将方法留在类中。更新了我的答案,请参见上文。