覆盖方法作为Scala中的字段

Vla*_*mir 4 scala

我不明白.为什么Scala支持覆盖方法作为字段:

abstract class A {
    def i: Int;
}

class B extends A {
    val i = 123;
}

val obj:A = new B();

println(obj.i)
Run Code Online (Sandbox Code Playgroud)

方法i是字段i.为什么?

Tra*_*own 9

查看此处发生的一种快速方法是编译此代码并用于javap检查生成的类.在这里,我们得到以下内容A:

public abstract class A implements scala.ScalaObject {
  public abstract int i();
  public A();
}
Run Code Online (Sandbox Code Playgroud)

对于B(有-p,所以我们看到任何私人成员):

public class B extends A implements scala.ScalaObject {
  private final int i;
  public int i();
  public B();
}
Run Code Online (Sandbox Code Playgroud)

因此,val最终作为一个带有getter的私有字段 - 就像你在惯用Java中编写的那样,虽然命名约定是不同的(并且实际上并不是约定,因为编译器会为你处理它).