scala-面向对象编程之对象

object

object相当于class的单个实例,通常在里面放一些静态的field或者method。第一次调用object的方法时就会执行object的constructor,也就是object内部不在method里的代码。但是object不能定义接受参数的constructor。

注意,object的constructor只会在第一次被调用时执行一次,以后再次调用就不会再执行constructor了。

object通常用于作为单例模式的实现,或者放class的静态成员,比如工具方法。

object Person {
private var eyeNum = 2
println("this Person Object!")
def getEyeNum = eyeNum
}

scala> Person.getEyeNum
this Person Object!
res0: Int = 2

伴生对象

如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类

伴生类和伴生对象必须放在同一个.scala文件中

伴生类和伴生对象最大的特点在于,可以相互访问private field

class Person(val name:String, val age:Int) {
def sayHello = println("Hi," + name + ",I guess you are " + age + "years old!" + "and you must have " + Person.eyeNum + "eyes")
}
object Person {

private val eyeNum = 2
def getEyeNum = eyeNum
}


scala> var p = new Person("wei", 30)
p: Person = Person@75f8d9b0

scala> p.sayHello
Hi,wei,I guess you are 30years old!and you must have 2eyes

让object继承抽象类

object的功能其实与class类似,除了不能定义接受参数的constructor之外

object也可以继承抽象类,覆盖抽象类中的方法

abstract class Hello(var message:String){
def sayHello(name:String):Unit
}
object HelloImpl extends Hello("Hello"){
override def sayHello(name:String)={
println(message + "," + name)
}
}

scala> HelloImpl.sayHello("wei")
Hello,wei

apply方法

object中非常重要的一个特殊方法,就是apply方法

通常在伴生对象中实现apply方法,并在其中实现构造伴生类的对象的功能。

而创建伴生类的对象时,通常不会使用new Class的方式,而使用Class()的方式,隐式的调用伴生对象的apply方法,这样会让对象创建更加简洁。

比如Array类的伴生对象的apply方法就实现了接受可变数量的参数,并创建一个Array对象的功能。

val a = Array(1,2,3)

比如定义自己的伴生类和伴生对象

class Person(val name:String)
object Person {
def apply(name:String) = new Person(name)
}

scala> var p = Person("wei")
p: Person = Person@39a03ccc

main方法

就如同java中,如果要运行一个程序,必须编写一个包含main方法类一样;在scala中,如果要运行一个应用程序,那么必须有一个main方法,作为入口。

scala中main方法定义为def main(args:Array[String]),而且必须定义在object中

object HelloWorld {
def main(args:Array[String]){
println("Hello world!!")
}
}

除了自己实现main方法外,还可以继承 App Trait,然后再将需要在main函数中运行的代码,直接作为object的constructor代码,而且用args可以接受传入的参数。

object HelloWorld extends App{
if (args.length>0) println("hello" + args(0))
else println("Hello world!")
}

用object来实现枚举功能

scala没直接提供类似于java中的Enum这样的枚举特性,如果要实现枚举,则需要用object继承Enumeration类,并且调用Value方法来初始化枚举值

object Season extends Enumeration{
val SPRING, SUMMER, AUTUMN, WINTER=Value
}

scala> Season.SPRING
res0: Season.Value = SPRING

还可以通过Value传入枚举值的id和name,通过id和toString可以获取;还可以通过id和name来查找枚举值

object Season extends Enumeration {
val SPRING = Value(0,"spring")
val SUMMER = Value(1, "summer")
val AUTUMN = Value(2, "autumn")
val WINTER = Value(3, "winter")
}

scala> Season.SPRING.id
res3: Int = 0

scala> Season.SPRING.toString
res4: String = spring

scala> Season(0)
res1: Season.Value = spring

scala> Season.withName("spring")
res2: Season.Value = spring

使用枚举object.values可以遍历枚举值


scala> for (ele <- Season.values) println(ele)
spring
summer
autumn
winter
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章