1.Object
object 相当于class 的单个实例通常放一些静态的field 和method
第一次调用object 的方法时,就会执行object 的constructor,也就是object 内部不在的method 方法;但是object 不能接受参数的constructor,object 的constructor 只会在第一次调用的时候执行,后面调用不会在执行,
object 通常用于单例模式,或者放置class 的静态成员。
2.伴生对象
如果有一个class ,还有一个同名的object 那么就称这个object 是class 的伴生对象,class 是object的伴生类。
伴生类和伴生class 对象必须放在一个scala 文件中伴生类和伴生对象最大的特点就是可以相互访问private field
object Persion {
private val namePersion=1;
def getName()=new Persion().classPersion
}
class Persion() {
private val classPersion=2;
def getName()=Persion.namePersion
}
3.继承
object 功能其实于class 类似,除了不能接受参数的constructor
object 也可以集成抽象类并覆盖其中的方法
abstract class HelloExtends(var message:String){
def sayHello(name:String)
}
object HelloExtendsImpl extends HelloExtends("hello"){
override def sayHello(name: String): Unit = {
println(message+name)
}
}
4.apply
在object 中有一个非常重要的方法,就是apply 方法
通常在半生对象中实现apply 方法,并在其中实现构造伴生类对象的功能
而创建伴生类的对象的时候,通常不会用new class 的方式,而是使用class() 的方式隐式调用apply 方法,这样会让对象创建的更加简洁。
比如Array 的伴生对象的apply 方法就实现了接受可变数量的参数,并创建了一个array 对象的功能
class ApplyPersion(var name:String) {
}
object ApplyPersion {
def apply(name:String): ApplyPersion = new ApplyPersion(name)
}
4.使用scala 实现枚举类型
Scala 没有像java 中那样提供枚举类型,如果要实现枚举,则需要用object 继承Enumeration 类,并且调用value 方法来实现
class ScalaEnum extends Enumeration {
var SPRING,SUMMER,AUTUMN,WINTER=Value
}
还可以通过value 传入枚举的id 和name
object ScalaEnumDemo{
def main(args: Array[String]): Unit = {
println(ScalaEnum(0))
println(ScalaEnum.values)
}
}