Scala:实例变量和对象初始化

史蒂夫·B。

我一直在考虑将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类中定义的。有人可以阐明如何实例化吗?显然,我对此的心理模型是不正确的。

阿科斯·克里瓦奇(Akos Krivachy)

首先让我们看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 )
 }
}

结论

您所了解的对象是正确的。什么是混淆是DelayedInitApp工具。快乐的编码;)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java实例初始化块和实例变量

来自分类Dev

每个对象初始化中的实例变量都相同

来自分类Dev

在实例变量初始化时初始化实例变量

来自分类Dev

声明和初始化实例/类变量的首选方式

来自分类Dev

Scala变量初始化

来自分类Dev

从未初始化的变量中获取对类对象的引用-未实例化的对象

来自分类Dev

类实例变量的初始化顺序?

来自分类Dev

Java实例变量的方法初始化

来自分类Dev

python实例变量初始化

来自分类Dev

设置未初始化的实例变量

来自分类Dev

活动的实例变量何时初始化?

来自分类Dev

初始化实例变量:惯用方式

来自分类Dev

对象被视为未初始化的变量

来自分类Dev

初始化变量类型的对象

来自分类Dev

初始化对象变量错误

来自分类Dev

在Android中实例化和初始化对象的正确方法

来自分类Dev

多线程客户端中COM对象的初始化和实例化

来自分类Dev

在父级和子级中都初始化一个实例变量

来自分类Dev

类设计:优雅地初始化和更新实例变量

来自分类Dev

Dart初始化程序列表和对最近填充的实例变量的访问

来自分类Dev

JavaScript声明和初始化变量

来自分类Dev

初始化变量和效率

来自分类Dev

Python Unittest和对象初始化

来自分类Dev

依赖注入和对象初始化

来自分类Dev

C ++指针和对象初始化

来自分类Dev

Python Unittest和对象初始化

来自分类Dev

实例化应用程序对象并初始化列表

来自分类Dev

使用对象初始化器实例化类

来自分类Dev

ios未初始化实例变量的快速初始化