Scala入门系列之六--伴生对象和伴生类

传送门
Scala入门系列之一--使用命令行往文件输入数据并读取数据
Scala入门系列之二--数组、元组、列表、集合数据类型简述
Scala入门系列之三--类和方法的创建以及命令行执行scala文件
Scala入门系列之四--类成员的可见性(private)以及用value和value_=进行读取和修改
Scala入门系列之五--主构造器和辅助构造器
Scala入门系列之六--伴生对象和伴生类
Scala入门系列之七--scala中的继承
Scala入门系列之八--scala中的特质(trait),也称接口
Scala入门系列之九--模式匹配两大法宝(match语句和case类)
Scala入门系列之十--包
Scala入门系列之十一--函数式编程基础
Scala入门系列之十二--高阶函数
Scala入门系列之十三--针对容器的操作(遍历/映射/过滤/规约操作)
Scala入门系列之十四--使用IDEA编写Scala代码并Maven打包提交集群运行
传送门

一、对象

1)单例对象:

  • Scala采用单例对象(singleton object)来实现与Java静态成员同样的功能
  • 使用object关键字定义单例对象

概念简述:单例对象又分为伴生对象和孤立对象

  • 当一个单例对象和它的同名类一起出现时,这时的单例对象被称为这个同名类的“伴生对象”(带有object的)。相应的类被称为这个单例对象的“伴生类”(带有class的
  • 类和它的伴生对象必须存在于同一个文件中,可以相互访问私有成员
  • 没有同名类的单例对象,被称为孤立对象(standalone object)。一般情况下,Scala程序的入口点main方法就是定义在一个孤立对象里
//单例对象的使用与一个普通的类实例一样:
//如下面普通的类实例Person
object Person {
    private var lastId = 0  //一个人的身份编号
    def newPersonId() = {
        lastId +=1
        lastId
    }
}

//单例对象又分为伴生对象和孤立对象
//•当一个单例对象和它的同名类一起出现时,这时的单例对象被称为这个同名类的“伴生对象”(带有object的)。相应的类被称为这个单例对象的“伴生类”(带有class的)
//•类和它的伴生对象必须存在于同一个文件中,可以相互访问私有成员
//•没有同名类的单例对象,被称为孤立对象(standalone object)。一般情况下,Scala程序的入口点main方法就是定义在一个孤立对象里


2)apply方法:

2.1)为什么要设计apply方法?

  • 保持对象和函数之间使用的一致性
  • 面向对象:“对象.方法” VS 数学:“函数(参数)”
  • Scala中一切都是对象,包括函数也是对象。Scala中的函数既保留括号调用样式,也可以使用点号调用形式,其对应的方法名即为apply

2.2)伴生对象中的apply方法:通常,在一个类的伴生对象中定义apply方法,在生成这个类的对象时,就省去了new关键字。又称为工厂方法

//代码文件为/usr/local/scala/mycode/MyTestApply.scala
class Car(name: String) {
    def info() {
        println("Car name is "+ name)
    }
}
object Car {
    def apply(name: String) = new Car(name) //调用伴生类Car的构造方法
}
object MyTestApply{
    def main (args: Array[String]) {
    val mycar = Car("BMW") //调用伴生对象中的apply方法!!!!!!!就这里省去了new
    mycar.info() //输出结果为“Car name is BMW”
    }
}

2.3)练习:完成代码计算等差数列第n项值。

要求:定义伴生对象和伴生类,伴生对象利用工厂方法实现伴生类的创建,伴生类定义一个apply方法用于计算等差数列第n项。伴生类的成员变量为分别是初始值start,步长step,和待计算的项数n。
ps:等差数列公式为An=A0+(n-1)d,其中An为第n项值,A0为初始值,d为步长

class sum(start:Int,step:Int,n:Int){
    var An = 0
    def apply(){
        An = start + ( n - 1 ) * step
        println(An)
    }
}

object sum{
    def apply(start:Int,step:Int,n:Int) = new sum(start,step,n)
}

object math{
    def apply(args:Array[String]){
        var myMath = sum(1,2,3)
        myMath.apply()
    }
}


你可能感兴趣的:(Scala入门系列之六--伴生对象和伴生类)