首页 > 解决方案 > 类中的单例对象与伴侣对象

问题描述

我写了以下代码:

class a {

  object c {
    var a = "STATIC"

    def m() = print("STATIC METHOD")

    var f = () => print("STATIC FUNCTION")
  }

}

object m {
  def main(args: Array[String]) = {
    var o = new a()
    o.c.m()
  }
}
  1. 我能说在object中声明的变量、函数和方法 c可以是静态的吗?
  2. 如果我更改对象c的名称,a那么该对象会成为伴随对象吗?

标签: scala

解决方案


an 中的字段和方法object是 Scala 声明您将static在 Java 中使用的事物的方式。为了直觉,我想您可以说这些字段通常是static(就像一次只在 JVM 中的一个字段中一样)。

但是,在您的示例中,您将 anobject放入了一个类中,使其不再是static。您可以使用几行代码轻松检查这一点(您可以在 Scastie 上找到)。

class MyClass {

  object Embedded {
    val a = "field"
    def m = println("method")
  }

}

val a = new MyClass().Embedded
val b = new MyClass().Embedded

// prints "a and b are different objects"
if (a eq b)
  println("a and b are the same object")
else  
  println("a and b are different objects")

关于您的第二个问题:不,class并且object必须在同一范围内才能成为伴生对象。您可以找到有关Scala 语言规范的更多详细信息。

我从那里引用:

通常,类的伴生模块是与类同名并定义在同一作用域和编译单元中的对象。相反,该类称为模块的伴生类。


推荐阅读