我不明白.为什么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.为什么?
查看此处发生的一种快速方法是编译此代码并用于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中编写的那样,虽然命名约定是不同的(并且实际上并不是约定,因为编译器会为你处理它).