1.单例对象
在某些场景下,我们可能不需要创建对象,而是想直接调用方法,但是scala语言并不支持静态成员变量,scals通过单例对象解决该问题,单例对象的创建方式如下:
1 | object Student{ |
object Student 编码后将生成两个字节码文件
Student$.class
Student.class
利用javap命令查看字节码文件内容有:
1 | javap -private Student$ |
他们都是final类型的,而且student不难看出,object Student最终生成了两个类,分别是Student和Student$ 的构造方法是私有的,通过静态成员域 public static final cn.scala.xtwy.Student$ MODULE$;对student$进行引用,这其实是java语言中单例实现方式
单例对象的使用方式同java语言类引用静态成员是一样的.
半生对象于伴生类
在前面的单例对象的基础之上,我们在objec Studeng 所在的文件内定义了一个class Student,此时object Student被称为class Student的伴生对象,而 class student 被称作object Student的伴生类 :
1 | class Student(var name:String,age:Int) |
从上面的代码中不难看出, 其实伴生对象与伴生类本质上是不同的两个类,只不过伴生类与伴生对象之间可以相互访问到对方的成员包括私有的成员变量或者方法,例如:
1 | class Student(var name:String,var age:Int){ |
apply方法
在前几节中我们提到,通过利用apply方法可以直接利用类名创建对象,例如前面在讲集合的时候,可以通过val intList=List(1,2,3)这种方式创建初始化一个列表对象,其实它相当于调用val intList=List.apply(1,2,3),只不过val intList=List(1,2,3)这种创建方式更简洁一点,但我们必须明确的是这种创建方式仍然避免不了new,它后面的实现机制仍然是new的方式,只不过我们自己在使用的时候可以省去new的操作。下面就让我们来自己实现apply方法,代码如下:
1 | //定义Student类,该类称为伴生类,因为在同一个源文件里面,我们还定义了object Student |
应用程序对象
利用IDE开发scala应用程序时,在运行程序时必须制定main方法作为程序的入口,例如:
1 | object Student { |
除了这种方式之外,scala还提供了一种机制,通过扩展App,在scala IDE for Eclipse 里通过new-> scala app方式创建的
也可以在代码直接指定:1
2
3
4//扩展App后,程序可以直接运行,而不需要自己定义main方法,代码更简洁
object AppDemo extends App{
println("App Demo")
}
抽象类
抽象类是一种不能被实例化的类,抽象类中包括了若干不能完整定义的方法,这些方法由子类扩展定义自己的实现.
1 | //scala中的抽象类定义 |
除抽象方法外,抽象类中还有抽象字段:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21abstract class Animal{
//抽象字段
//前面我们提到,一般类中定义字段的话必须初始化,而抽象类中则没有这样的要求
var height:Int
def eat:Unit
}
//Person继承Animal,对eat方法进行了实现
//通过主构造器对height参数进行了初始化
class Person(var height:Int) extends Animal{
//对父类中的方法进行实现,注意这里面可以不加override关键字
def eat()={
println("eat by mouth")
}
}
//通过扩展App创建程序的入口
object Person extends App{
new Person(10).eat()
}
1 | //上面这几个类会产生以下四个字节码文件 |