前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala-12.对象(object)

Scala-12.对象(object)

作者头像
悠扬前奏
发布2019-07-15 12:54:58
5930
发布2019-07-15 12:54:58
举报
  • 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中实现工厂方法。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.07.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档