scala - 类中的单例对象与伴侣对象
问题描述
我写了以下代码:
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()
}
}
- 我能说在object中声明的变量、函数和方法
c
可以是静态的吗? - 如果我更改对象
c
的名称,a
那么该对象会成为伴随对象吗?
解决方案
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 语言规范的更多详细信息。
我从那里引用:
通常,类的伴生模块是与类同名并定义在同一作用域和编译单元中的对象。相反,该类称为模块的伴生类。
推荐阅读
- redis - 在 Windows 中将 Redis Sentinel 注册为服务时授予“NT AUTHORITY \ NetworkService”读/写权限的问题
- sql - 是否有权限,您可以在其中恢复数据库,而无需成为 db_owner?
- java - 尽管使用了循环,但 Json 请求仅获取一个对象
- ios - 我正在用两行单元格实现 UICollectionView,我需要两者都可以同时水平滚动
- angular - ReferenceError:未定义 MatInputModule
- geolocation - ionic @ionic-native/geolocation 添加提供者问题
- jquery - 无法识别 beforeShowDay 选项
- android - 如何在 ColorStateList 中不指定颜色?
- mfc - 在 MFC 应用程序中序列化 std::string
- system-verilog - 流式操作符在 PHY 中的串行器上下文中的使用