scala类和对象
scala是面向对象的语言,且比java更加的面向对象,而且更加简洁,很多东西都是在编译期间生成的。在scala中,类并不声明为public。scala源文件中可以包含多个类,所有这些类都具有公有可见性。
声明类的语法
一个源文件中可以有多个类
声明一个类
1 2 3 4 5 6 7 8
| class Cat{ var name:String = _ var color:String = _ val life:Int = 10 }
|
类的声明默认是public的,且在同一个源文件中可以包含多个类
类中的属性必须进行显式的初始化,如果暂时不想赋值,可以使用_来赋默认值
编译之后生成的java代码为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public class Cat { private String name; private String color; private final int life;
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; } public int life() { return this.life; } public Cat() { this.life = 10; }
}
|
1 2 3 4 5 6 7
| def main(args: Array[String]): Unit = { val cat= new Cat cat.name = "小花" cat.color = "黄白" printf("%s的颜色是%s",cat.name,cat.color) }
|
看到这里可能大家很是纳闷,为什么Cat类中的name和color是private的,却可以直接进行赋值呢?来看一下编译之后生成的java,真正调用的其实是name_$eq
和color_$eq
方法
1 2 3 4 5 6
| public void main(final String[] args) { final Cat cat = new Cat(); cat.name_$eq("小花"); cat.color_$eq("黄白"); Predef$.MODULE$.printf("%%s的颜色是%s", (Seq)ScalaRunTime$.MODULE$.genericWrapArray((Object)new Object[] { cat.name(), cat.color() })); }
|