Scala基础-对象:单例对象、伴生对象、apply方法

单例对象:

在Scala中,没有静态方法或静态字段,为了达到同样目的,Scala中使用单例对象,以object关键字定义,单例对象为程序的执行提供入口点

单例是一种只能有一个实例的对象

单例对象的成员、方法都默认是静态的,可以全局访问,共享全局变量很有意义

单例对象还可以扩展类和性状

与类不同的是,单例对象没有参数,单列对象可以拥有类的所有特性

需要注意的是,单例对象会在第一次被访问的时候初始化

伴生对象:

当一个单例对象与类具有相同的名称时,这个单例对象被称作是这个类的伴生对象,同样,这个类被称作是这个单例对象的伴生类

类和它的伴生对象可以互相访问私有特性,类和它的伴生对象必须定义在同一个源文件

独立对象:

当一个单例对象没有与类具有相同的名称,这个单例对象被称作是独立对象。

独立对象一般作为Scala应用的入口点,或相关功能方法的工具类

apply方法:

通常,在一个类的伴生对象中定义apply方法,在生成这个类的对象时,就省去了new关键字

apply方法主要用来解决复杂对象的初始化问题

Scala的apply有两种方式,一种是伴生类的apply,另一种是伴生对象的apply


下面举几个简单的例子来说明:

  • 单例对象

/**
  *   单例对象
  */
object Student {
    private val name:String="tom"

    def getName: Unit ={
        println("My name is "+name)
    }
}

object Init{
  def main(args: Array[String]): Unit = {
    //  直接调用Student的getName方法即可
    Student.getName
  }
}

结果:

My name is tom
  • 伴生对象
//  伴生类
class Student(var name: String,var address: String) {
  //  学校
  private val school = "no.1 middle school"

  //  调用伴生对象的私有成员
  def getID: Unit ={
    println("获取伴生对象的私有成员"+Student.id)
  }
}

//  伴生对象
object Student {
  //  学号
  private var id:Int=1

  def main(args: Array[String]): Unit = {
    //  实例化对象tom
    val tom =new Student("tom","北京")
    //  获取伴生类的私有成员school
    println("获取伴生类的私有成员"+tom.school)
    //  获取伴生对象的私有成员id
    tom.getID
    println("我叫"+tom.name+",住在"+tom.address+",在"+tom.school+"上学,"+"学号是"+id)
  }
}

结果:

获取伴生类的私有成员no.1 middle school
获取伴生对象的私有成员1
我叫tom,住在北京,在no.1 middle school上学,学号是1

  • apply
//  伴生类
class Student(var name: String,var address: String) {
  //  学校
  private val school = "no.1 middle school"

  //  调用伴生对象的私有成员
  def getID: Unit ={
    println("获取伴生对象的私有成员"+Student.id)
  }
}

//  伴生对象
object Student {
  //  学号
  private var id:Int=1

  //  定义apply方法,实例化伴生类
  def apply(name: String, address: String): Student = new Student(name, address)

  def main(args: Array[String]): Unit = {
    //  通过伴生对象的apply方法创建实例
    val jerry=Student("jerry","上海")
    println("获取伴生类的私有成员"+jerry.school)
    jerry.getID
    println("我叫"+jerry.name+",住在"+jerry.address+",在"+jerry.school+"上学,"+"学号是"+id)

  }
}

结果:

获取伴生类的私有成员no.1 middle school
获取伴生对象的私有成员1
我叫jerry,住在上海,在no.1 middle school上学,学号是1

  • 伴生类与伴生对象的apply

class ApplyTest {
  def apply() = println("这是伴生类的apply方法")
}
object ApplyTest {
  def apply() = {
    println("这是伴生对象的apply方法")
     new ApplyTest
  }
}
//  独立对象,作为程序入口
object ApplyInit{
  def main(args: Array[String]): Unit = {
    //  通过伴生对象的apply方法,进行实例化
    val applyTest=ApplyTest()
    //  这是伴生类的apply方法
    applyTest()
  }
}

结果:

这是伴生对象的apply方法
这是伴生类的apply方法

赫墨拉

我是一个喜爱大数据的小菜鸡,这里是我分享我的成长和经历的博客

1 Response

  1. Aly Chiman说道:

    Hello there,

    My name is Aly and I would like to know if you would have any interest to have your website here at louisvv.com promoted as a resource on our blog alychidesign.com ?

    We are in the midst of updating our broken link resources to include current and up to date resources for our readers. Our resource links are manually approved allowing us to mark a link as a do-follow link as well
    .
    If you may be interested please in being included as a resource on our blog, please let me know.

    Thanks,
    Aly

发表评论

邮箱地址不会被公开。