Scala中的类class apply使用

package com.supeng.spark.scala
/**
 * 1,在Scala中定义类使用关键字class
 * 2,可以使用new className可以构造出类的对象
 * 3,如果名称相同,则object中的内容都是class的静态内容,也就是说object中的内容在class中可以直接调用;正是因为可以在没有类的
 *   的实例的时候调用object中一切内容,所以可以使用object中的特定方法来创建类的实例,而这个方法就是apply方法
 * 4,object中的apply方式是class对象生成的工厂方法,用于控制对象的生成。
 * 5,很多框架的代码一般直接调用抽象类的object的apply方法生成类的实例对象
 *   第一:其秘诀在于apply具有类的对象生成的一切生杀大权,抽象类是不可以直接实例化的,在apply中可以实例化抽象类的子类,
 *      以Spark的图计算为例,Graph是抽象的class,在object Graph中的apply 方法实际上是调用了Graph的子类GraphImpl来构建
 *      Graph类型的对象实例的,当然从Spark的图计算的源码中可以看出,GraphImpl的构造也是使用了object GraphImpl的apply方法
 *    第二:这种方式神奇的效应在于更加能够应对代表版本迭代或者修改的变化,这是更高意义的面向接口编程
 * 6,object HelloOOP是class HelloOOP的伴生对象,class HelloOOP是可以直接访问object HelloOOP 中的一切内容,而class He'llOOP是Object He'llOOP
 *    的伴生类,object HelloOOP 可以直接访问class HelloOOp的一切内容,一个特例是用private[this]修饰的成员,我们会在后面讲解
 * 7,在定义Scala的class的时候可以直接在类名后面()里加入类的构造参数,此时在apply方法中也必须有这些参数
 * 8,scala中可以在object中构造很多apply方法
 * 9,Scala中很多集合都是使用apply的方式构造的,例如Array
 *
 *
 */
class HelloOOP(age:Int){
  var name = "Spark"
  def sayHello = println("My name is "+ name + " I am "+age +" years old!")
 
}
object HelloOOP {
 var number =0
  def main(args : Array[String]) : Unit = {
    println("Hello Scala OOP!!!")
   
    val helloOOP = HelloOOP(30)
    helloOOP.sayHello
  }
 
  def apply(age:Int):HelloOOP = {
    println("My number is "+number)
    number +=1
   new HelloOOP(age)
  }
}

猜你喜欢

转载自blog.csdn.net/superiorpengFight/article/details/54315095