==== objects === 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. ==== classes ==== 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(); }