Scala-12.对象(object)
2019-07-13 本文已影响0人
悠扬前奏
-
object在Scala中是一个关键词,同时对象也是一个概念,即类的一个实例
-
asInstanceOf方法可以将一个实例强制转换为另一个期望的类型。
-
用scala的classOf方法来代替Java的.class。可以得到对象所属的类
-
创建启动入口有两种方式,其实两种方法都是从object启动而不是class:
- 继承App特质的object:
- 该特质使用DelayedInit功能实现,也就是object的字段在main方法执行前都没有被初始化
- 一般不需要覆盖main方法:其目的是将整个类编程main方法。除非是确实有意为之,选择去覆盖
- 定义一个object,实现main方法
- 继承App特质的object:
-
用object关键字创建的对象是Singleton的,对象的方法定义在obejct而不是类中,可以像Java中调用静态方法
-
可以在类中定义非静态的实例成员,然后在同一个文件中再定义一个类相同名字的“静态”成员对象。这个对象被称为伴生类。
- 和Java静态类的区别在于:
- 在同一文件中定义对象和类,并赋予相同的名字
- 在对象内定义“静态”成员
- 在类内定义非静态成员
- 类和其伴生类可以互相访问对方的私有成员变量。
- 和Java静态类的区别在于:
-
将要在所有类中共享的代码放在一个包的包对象中,可以在不引入类或者对象的前提下,让函数、字段和其他代码在包级别可用。
-
通过以下两种办法可以不用new关键字创建类的实例,使代码更简洁:
- 为类创建半生类,并在伴生类内按照所需的构造函数签名定义一个apply方法。
- 本质上是类的构造函数:
- 为类创建半生类,并在伴生类内按照所需的构造函数签名定义一个apply方法。
class Person {
var name: String = _
}
object Person {
def apply(name: String): Person = {
val p = new Person
p.name = name
p
}
}
- 将类定义为case类,本质上还是在应为case类为伴生类中生成了一个apply方法:
case class Person(var name:String)
-
如果需要为在通过apply方法创建多个构造函数,可以在提供构造函数签名的伴生类中定义多个apply方法。
-
case被创建时同事会为默认构造函数实现访问器(选择生成)和取值器(这回产生很多隐藏的代码膨胀)
-
通过apply方法可以在Scala中实现工厂方法。