我是scala的新手,并试图了解scala oops概念。 我创建了一个类:
class MyComp private{
// some fields and method goes here
}
当我将其编译为
时scalac MyComp.scala
它创建一个私有构造函数。但是当我创建一个伴侣对象而不是构造函数变得公开时,我无法理解这个概念。请清除
这是MyComp类的伴随对象的代码
object MyComp
{
private val comp= new MyComp;
def getInstance= comp;
}
答案 0 :(得分:6)
JVM不理解伴随对象的概念(以及scala语言的其他方面)。
因此,scalac别无选择,只能根据Java字节码使MyComp
的构造函数公开,否则JVM将不允许MyComp$
(MyComp
的伴随类,通常称为模块类)来实例化MyComp
。这是因为MyComp
和MyComp$
与JVM的观点完全无关。
Scalac尝试尽最大努力保持可见性修饰符,但有时必须提高字节码中的可见性,以支持某些特定于Scala的规则。