Scala-12.对象(object)

2019-07-15 12:54:58 浏览数 (1)

  • object在Scala中是一个关键词,同时对象也是一个概念,即类的一个实例
  • asInstanceOf方法可以将一个实例强制转换为另一个期望的类型。
  • 用scala的classOf方法来代替Java的.class。可以得到对象所属的类
  • 创建启动入口有两种方式,其实两种方法都是从object启动而不是class:
    • 继承App特质的object:
      • 该特质使用DelayedInit功能实现,也就是object的字段在main方法执行前都没有被初始化
      • 一般不需要覆盖main方法:其目的是将整个类编程main方法。除非是确实有意为之,选择去覆盖
    • 定义一个object,实现main方法
  • 用object关键字创建的对象是Singleton的,对象的方法定义在obejct而不是类中,可以像Java中调用静态方法
  • 可以在类中定义非静态的实例成员,然后在同一个文件中再定义一个类相同名字的“静态”成员对象。这个对象被称为伴生类。
    • 和Java静态类的区别在于:
      • 在同一文件中定义对象和类,并赋予相同的名字
      • 在对象内定义“静态”成员
      • 在类内定义非静态成员
    • 类和其伴生类可以互相访问对方的私有成员变量。
  • 将要在所有类中共享的代码放在一个包的包对象中,可以在不引入类或者对象的前提下,让函数、字段和其他代码在包级别可用。
  • 通过以下两种办法可以不用new关键字创建类的实例,使代码更简洁:
    • 为类创建半生类,并在伴生类内按照所需的构造函数签名定义一个apply方法。
      • 本质上是类的构造函数:
代码语言:javascript复制
class Person {
    var name: String = _
}

object Person {
    def apply(name: String): Person = {
        val p = new Person
        p.name = name
        p
    }
}
  • 将类定义为case类,本质上还是在应为case类为伴生类中生成了一个apply方法:
代码语言:javascript复制
case class Person(var name:String)
  • 如果需要为在通过apply方法创建多个构造函数,可以在提供构造函数签名的伴生类中定义多个apply方法。
  • case被创建时同事会为默认构造函数实现访问器(选择生成)和取值器(这回产生很多隐藏的代码膨胀)
  • 通过apply方法可以在Scala中实现工厂方法。

0 人点赞