Consider the following Scala object
object HelloObj { val f = "one field"; val x = 3; }
It gets compiled to two files, HelloObj.class and HelloObj$.class. The first of these only exists to make life easier for Java programmers.
public final class HelloObj extends java.lang.Object{
public static final int $tag();
public static final int x();
public static final java.lang.String f();
}
public final class HelloObj$ extends java.lang.Object implements scala.ScalaObject{
public static final HelloObj$ MODULE$;
public static {};
public HelloObj$();
public int x();
public java.lang.String f();
public int $tag();
}
Writing “HelloObj.x()” in Scala is the same as writing “HelloObj$.MODULE$.x()”, but the former should probably be preferred for readability.
Now the following two Scala classes ...
class Foo { val x = "somefield" final val xx = "finalField" var z = 3; final var zz = 3; } class Bar extends Foo { override val x = "someOverridenValue" }
get compiled to the following Java classes
public class Foo extends java.lang.Object implements scala.ScalaObject{
public Foo();
public final void zz_$eq(int);
public final int zz();
public void z_$eq(int);
public int z();
public final java.lang.String xx();
public java.lang.String x();
public int $tag();
}
public class Bar extends Foo implements scala.ScalaObject{
public Bar();
public java.lang.String x();
}