假定此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,以使内容更清晰,更准确地表示正在发生的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句