0%

scala类和对象

scala类和对象

scala是面向对象的语言,且比java更加的面向对象,而且更加简洁,很多东西都是在编译期间生成的

声明类的语法

1
2
3
4
// 默认就是public的
[修饰符] class 类名{
类体
}

一个源文件中可以有多个类

声明一个类

1
2
3
4
5
6
7
8
class Cat{
// 属性语法 [访问修饰符] var 属性名称 [:类型] = 属性值
// _表示赋默认值,如果使用_来给默认值,则必须指定类型
var name:String = _
var color:String = _
// 如果属性声明为val则必须赋一个明确值,且只会生成getter方法不会生成setter方法
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
private String name;
private String color;
// val生成的是final的
private final int life;


//相当于name属性的getter方法
public String name() {
return this.name;
}
// 相当于name属性的setter方法
public void name_$eq(final String x$1) {
this.name = x$1;
}
//相当于color属性的getter方法
public String color() {
return this.color;
}
//相当于color属性的setter方法
public void color_$eq(final String x$1) {
this.color = x$1;
}
// val修饰的只会生成getter方法
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 | var 对象名 [:类型] = new 类型()
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() }));
}