假设这段 Java 代码:
public class A {
public A(String g) {
x += g.length();
}
private int x = 0;
}
如果我创建 A 的实例,如下所示:
A a = new A("geo");
调用之后,x 的值将为 3。我的 Scala 代码哪里做错了?
class A(val g:String) {
x += g.length
var x:Int = 0
}
object x extends Application {
val x = new A("geo")
println(x.x)
}
这会打印 0。我假设当编译器到达 var x:Int = 0
时,主构造函数的主体已经结束。我错了吗?您还能如何在 Scala 中声明实例变量(假设我不想在我的构造函数中使用它们)?
最佳答案
请记住,您的代码会转换为与此类似(但不完全)的内容:
public class A {
private final String g;
private int x;
public A(String g) {
this.g = g;
x_$eq(x() + g.length());
x = 0;
}
public void x_$eq(int arg0) {
x = arg0;
}
public int x() {
return x;
}
public String g() {
return g;
}
}
但在(非构造函数)方法中定义的变量会被翻译成实际的局部变量。
不确定这是否能解释推理并突出其中一个差异。
编辑 - 将“翻译”从 scala 更改为 java,以便更清晰和更准确地表示正在发生的事情。
关于java - 在 Scala 的实例变量方面需要一些帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917182/