类中Singleton Object与Companion Object相关技术问题咨询
先把你的代码整理成易读的格式:
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中声明的变量、函数及方法称为static(静态)成员?
严格来说,不能直接这么称呼哦。Scala本身没有Java那种static关键字和类级静态成员的概念,你代码里的object c是嵌套在类a内部的单例对象,它的成员虽然在用法上和Java的static有几分相似,但本质机制完全不同:
- Java的static成员属于类本身,不需要创建类实例就能访问;但这个
object c是一个独立的单例实例,而且必须通过外部类a的实例才能访问它(就像你代码里写的new a().c.m()),属于路径依赖的单例。 - 从Scala的术语体系来说,我们会称这些为“嵌套单例对象的成员”,而不是“static成员”。当然如果只是从功能类比的角度提一嘴,别人大概能理解,但严谨起见还是要区分开两者的本质差异。
问题2:若将object c的名称改为a,该object是否会成为companion object(伴生对象)?
答案是不会。Scala对伴生对象的定义有明确的规则,缺一不可:
- 必须和对应的类同名;
- 必须和类处于同一个源文件的顶级作用域(简单说就是不能嵌套在类的内部);
- 伴生类和伴生对象之间可以互相访问对方的私有成员。
你要是把object c改成object a并放在class a内部,它只是类a里的一个嵌套单例对象而已。如果想要创建class a的伴生对象,得把它移到和class a同级的位置,比如这样:
class a { // 类的成员定义 } // 这里才是class a的伴生对象 object a { def someMethod(): Unit = println("我是伴生对象的方法") } object m { def main(args: Array[String]) = { a.someMethod() // 直接通过类名访问伴生对象的成员 } }
内容的提问来源于stack exchange,提问作者USER
相关产品推荐
相关产品推荐

