Ну, тут еще веселее.Если вы попробуете это:
class Rational(n: Int, d: Int) {
override val toString = n + "/" + d
}
Тогда частные переменные снова исчезнут!
public class Rational extends java.lang.Object implements scala.ScalaObject{
private final java.lang.String toString;
public java.lang.String toString();
public Rational(int, int);
}
Разница в том, что когда вы используете d
и n
в методе, они имеютбыть сохраненным.Если они не используются в методе, только в конструкторе (например, val
initialization), тогда они не должны существовать как члены каждого экземпляра.Взгляните на декомпилированную версию def toString
:
public java.lang.String toString();
Code:
0: new #10; //class scala/collection/mutable/StringBuilder
3: dup
4: invokespecial #14; //Method scala/collection/mutable/StringBuilder."<init>":()V
7: aload_0
8: getfield #19; //Field n:I
11: invokevirtual #23; //Method scala/collection/mutable/StringBuilder.append:(I)Lscala/collection/mutable/StringB
uilder;
14: ldc #25; //String /
16: invokevirtual #28; //Method scala/collection/mutable/StringBuilder.append:(Ljava/lang/Object;)Lscala/collectio
n/mutable/StringBuilder;
19: aload_0
20: getfield #30; //Field d:I
23: invokestatic #36; //Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
26: invokevirtual #28; //Method scala/collection/mutable/StringBuilder.append:(Ljava/lang/Object;)Lscala/collectio
n/mutable/StringBuilder;
29: invokevirtual #38; //Method scala/collection/mutable/StringBuilder.toString:()Ljava/lang/String;
32: areturn
См. Строки 8 и 20?