需要帮助来解释scala问题

zjf*_*fdu 4 scala

我有两个scala类(当我javap -private用来读取类文件时它们的Java代码).

当我使用n,并dtoString方法,会产生类私有成员域.这是为什么?我有点困惑.

Scala#1:

class Rational(n: Int, d: Int) {

}
Run Code Online (Sandbox Code Playgroud)

相当于javap:

public class com.zjffdu.tutorial.scala.Rational
extends java.lang.Object
implements scala.ScalaObject{
    public com.zjffdu.tutorial.scala.Rational(int, int);
}
Run Code Online (Sandbox Code Playgroud)

Scala#2:

class Rational(n: Int, d: Int) {
  override def toString() = n + "/" + d
}
Run Code Online (Sandbox Code Playgroud)

相当于javap:

public class com.zjffdu.tutorial.scala.Rational
extends java.lang.Object
implements scala.ScalaObject{
    private final int n;
    private final int d;
    public java.lang.String toString();
    public com.zjffdu.tutorial.scala.Rational(int, int);
}
Run Code Online (Sandbox Code Playgroud)

Jea*_*let 7

那么,身体内部的价值nd需要以某种方式提供toString,对吧?否则你无法使用它们.任何事情都可能当你构建一个新的实例之间发生n,并d恰巧是在栈上,当你打电话toString,并np早已从堆栈中消失了.因此,编译器会自动将值保存在字段中 - 即使您未(private) val在代码中将它们声明为s.编译器将对在类的构造函数之外使用的所有构造函数变量执行此操作(请记住,类的构造函数实际上是类本身的整个主体,不包括valdef定义).