我一直在考虑将scala对象视为单例Java对象的简写形式-也就是说,我希望它们的行为类似于具有单例实例化保证的对象。然后我遇到了这样的事情,我不明白:
object Test extends App{
var x ="a"
override def main(args:Array[String]):Unit = {
println(x )
}
}
它输出null而不是“ a”。
查看生成的类,我得到一个Test $ .class,它是对象定义;但是,实例值“ a”是使用生成的delayInit在伴随Test类中定义的。有人可以阐明如何实例化吗?显然,我对此的心理模型是不正确的。
首先让我们看App
一下它是如何工作的。App的文档揭示了以下警告:
应当注意的是,此特征是使用DelayedInit功能实现的,这意味着在执行main方法之前,对象的字段将尚未初始化。
还应注意,通常不需要重写main方法:目的是将整个类体转变为“ main方法”。如果您知道自己在做什么,则应该只选择覆盖它。
好的太棒了。现在我们知道了这两个事实,让我们修复您的代码。我们可以考虑两种可能的解决方案:
仅在知道我们在做什么时才覆盖main方法:
object Test extends App{
var x ="a"
println(x )
}
或者我们可以选择定义一个main
方法,但不能扩展App
:
object Test {
var x ="a"
def main(args:Array[String]):Unit = {
println(x )
}
}
您所了解的对象是正确的。什么是混淆是DelayedInit该App
工具。快乐的编码;)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句