Scala面向对象之伴生类与伴生对象详解

在Scala中,类和伴生对象可以相互访问private filed


伴生类与伴生对象

/**
 * 1.伴生类和伴生对象必须存放在一个.scala文件中
 * 2.如果有一个class和object同名,那么就称这个object为class的伴生对象,反之class为object的伴生类
 * 3.伴生类和伴生对象:
 *          特点:互相可以访问private filed
 */
object Person {
  private val money = 100
  def getMoney = money

  def main(args: Array[String]) {
    var p = new Person()
    p.name="小健"
    p.say
  }
}
class Person{
  private var name = ""
  def say = println(name+",you have "+Person.money+"$")
}

结果:

小健,you have 100$


object继承抽象类

// object的功能其实和class类似,除了不能定义接受参数的constructor之外
// object也可以继承抽象类,并覆盖抽象类中的方法

abstract class Person(var message: String) {
  def sayHello(name: String): Unit
}

object Person extends Person("hello") {
  override def sayHello(name: String) = {
    println(message + ", " + name)
  }

  def main(args: Array[String]) {
    sayHello("小健")
  }
}

结果:

hello,小健


apply方法

// object中非常重要的一个特殊方法,就是apply方法
// 通常在伴生对象中实现apply方法,并在其中实现构造伴生类的对象的功能
// 而创建伴生类的对象时,通常不会使用new Class的方式,而是使用Class()的方式,隐式地调用伴生对象得apply方法,这样会让对象创建更加简洁
class Person(val name: String)
object Person {
  def apply(name: String) = new Person(name)

  def main(args: Array[String]) {
    val p = new Person("小健")              //一般形式   new class
    println(p.name)
    val p1 = Person("小健1")                //Calss()直接使用
    println(p1.name)
  }
}

结果:

小健

小健1


枚举

// Scala没有直接提供类似于Java中的Enum这样的枚举特性,
// 如果要实现枚举,则需要用object继承Enumeration类,并且调用Value方法来初始化枚举值
object Person extends Enumeration {
  val SPRING, SUMMER, AUTUMN, WINTER = Value

  def main(args: Array[String]) {
    // 使用枚举object.values可以遍历枚举值
    for (ele <- Person.values) println(ele)
  }
}

结果:

SPRING

SUMMER

AUTUMN

WINTER

你可能感兴趣的:(Scala)