java - 在 Scala 的实例变量方面需要一些帮助

标签 java oop scala language-features

假设这段 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/

相关文章:

java - 使用ajax post将json从js发送到 Controller

java - Java 中带时区的日期

c++ - 派生异常不继承构造函数

scala - 从任务运行 SBT 命令

scala - 用于合并的 Spark 结构类型

scala - 方法映射的参数太多 : (apply: (String, models.Address) => R)(unapply : R => Option[(String, models.Address)])play.api.data.Mapping[R]

java - (修正)如何显示输入与数组的匹配?

java - 使用Java在谷歌应用程序引擎上逐像素读取和修改图像,几乎就在那里

javascript - 如何为大型项目从基于对象的语言迁移到服务器端 Node.js Javascript?

c++ - 在 Smalltalk 中设计事务管理器