在之前得例子中也看到过有得文件中既声明了class又声明了object,这两个有什么区别呢,为什么main方法要在object中而不能和java一样在class中呢?
这是因为scala中将static关键字去掉了,采用了伴生类和伴生对象得概念来区分静态和非静态,在伴生类中得都是非静态得,而在伴生对象中声明得都是静态得
// 伴生类class Cat{ // _表示赋默认值 var name:String = _ var color:String = _}// 伴生对象object Cat{ var count:Int = _} val cat= new Cat cat.name = "小花" cat.color = "黄白" // 可以直接使用类来调用伴生对象中得字段和方法 Cat.count
class Cat编译后生成得java为
public class Cat{ private String name; private String color; public static void count_$eq(final int x$1) { Cat$.MODULE$.count_$eq(x$1); } public static int count() { return Cat$.MODULE$.count(); } public String name() { return this.name; } public void name_$eq(final String x$1) { this.name = x$1; } public String color() { return this.color; } public void color_$eq(final String x$1) { this.color = x$1; }}
object Cat编译成java之后为
public final class Cat${ public static final Cat$ MODULE$; private static int count; static { MODULE$ = new Cat$(); } public int count() { return Cat$.count; } public void count_$eq(final int x$1) { Cat$.count = x$1; } private Cat$() { }}
在伴生对象中声明apply方法,可以实现类名(参数)方式创建对象实例
object Cat{ var count:Int = _ def apply():Cat = new Cat("小花")}// 不需要使用new来实例化,会自动调用apply()方法val aCat = Cat()






