2019-04-22

关键字:Scala 伴生对象的作用

关于 Scala 伴生对象,比教材更详细的解释。


什么是伴生对象?

教材中关于伴生对象的解释是:实现类似 Java 中那种既有实例成员有静态成员的类的功能。

为什么上面说它是一种 “功能” 呢?因为要想实现像 Java 中那样的类,光靠一个 Scala 类可不行。在 Scala 中,我们必须:

1. 定义一个 class 并在这里面实现所有的实例成员

2. 添加一个 object ,这个 object 要与上面的 class 同名,然后在这里面实现所有的静态成员

3. 定义的 class 与 object 必须在同一个文件内

满足了上面 3 条要求以后,就可以实现类似 Java 中一个类既存在实例成员又存在静态成员的功能了。然后我们通常把第 2 步添加的 object 称为 “伴生对象” 。转化成代码,就像下面这样

class CompanionDemo {

  println("new CompanionDemo clz")

  def init(): Unit = {
// our codes...
} } object CompanionDemo { println("new CompanionDemo object") def prt(): Unit = {
// our codes...
} }

伴生对象有什么特点?

毫无疑问,伴生对象这种存在最大的特点就是可以实现类似 Java 中那样,在同一个类里既有实例成员又有静态成员的功能。

另一个特点就是 class CompanionDemo 和 object CompanionDemo 虽然分开两处定义,但却可以访问对方的 private 变量及方法。访问私有属性的一个小示例如下

class CompanionDemo {

  private var clzi = 0

  def init(): Unit = {

    println("variable in clz:" + clzi)
println("variable from object:" + CompanionDemo.obji)
CompanionDemo.access(this) } } object CompanionDemo { private var obji = 1 def access(clz: CompanionDemo): Unit = { println("variable in object:" + obji)
println("variable from clz:" + clz.clzi) } }

相互访问私有属性

并通过如下代码来访问伴生对象

object cpDemp {

  def main(args: Array[String]){

    val cd = new CompanionDemo()
cd.init() } }

执行结果如下

variable in clz:0
variable from object:1
variable in object:1
variable from clz:0

如您所想的执行结果

伴生对象中要想访问对方的私有属性,需要注意以下 2 点

1. class 中要访问 object 中的私有属性,直接以 object 名来 “点” 相应的变量或方法即可,可以参考上面例子

2. object 中要访问 class 中的私有属性,必须要通过 class 的对象引用来 “点” 相应变量或方法,可以参考上面例子

伴生对象的意义是什么?

Scala 中没有 static 关键字,而 Scala 又运行与 JVM 之上,与 Java 类库完全兼容的编程语言,同时类中拥有静态属性又是如此的有必要,因此推出这个伴生对象机制就显得很有必要了。所以第 1 个意义就是为了弥补类中不能定义 static 属性的缺陷

那我们知道,在 Java 中静态属性是属于类的,在整个 JVM 中只开辟一块内存空间,这种设定使得静态属性可以很节省内存资源,不用担心像实例属性那样有内存溢出的风险。在 Scala 中伴生对象本质上也是生成静态属性,所以这第 2 个意义就是节省内存资源

既然静态属性在整个 JVM 中仅开辟一块内存空间,那就说明我们可以在所有实例当中共享这块内存里面的信息,所以第 3 个意义就是资源共享


聊聊 Scala 的伴生对象及其意义的更多相关文章

  1. scala 类,伴生对象

    1.属性的定义 编写一个PersonS类,并在其中定义一些属性,通过PersonS.scala 编译后的情况查看,可以知道不同修饰符修饰的属性分别会生成什么方法(set,get) package co ...

  2. scala伴生对象

    package com.test.scala.test /** * 伴生对象指的是在类中建立一个object */ class AssociatedObject { private var count ...

  3. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

  4. Scala单例对象、伴生对象实战详解

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  5. Scala学习笔记之伴生对象

    所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰. 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的 ...

  6. scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

    一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...

  7. Scala伴生类和伴生对象

    单例对象与类同名时,这个单例对象被称为这个类的伴生对象,而这个类被称为这个单例对象的伴生类.伴生类和伴生对象要在同一个源文件中定义,伴生对象和伴生类可以互相访问其私有成员.不与伴生类同名的单例对象称为 ...

  8. Scala学习笔记(二):object、伴生对象和基本类

    object object 是只有一个实例的类.它的定义与Java中的class类似,如: // 单例对象 object AppEntry { def main(args: Array[String] ...

  9. Scala单例对象和伴生对象

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

随机推荐

  1. TensorFlow tutorial

    代码示例来自https://github.com/aymericdamien/TensorFlow-Examples tensorflow先定义运算图,在run的时候才会进行真正的运算. run之前需 ...

  2. ACCP8.0 HTML标签

    ACCP8.0 HTML标签 第一章1.HTML超文本标记语言2.网页<html></html>3.网页头部<head></head>4.网页标题< ...

  3. c#如何声明数据结构类型为null?

    可以通过如下两种方式声明可为空的类型:System.Nullable<T> variable;T?variable:eg:int值是-2,147,483,648 到 2,147,483,6 ...

  4. IntelliJ IDEA如何激活?

    本文使用的IDEA的版本是:14.0.3 下载IDEA授权服务器(下载地址见最后),并解压,打开解压后的IntelliJIDEALicenseServer目录,可以看到如下的两个文件: Intelli ...

  5. Linux下安装使用Redis

    cd /usr/local/src   //进入src目录  wget http://download.redis.io/releases/redis-4.0.1.tar.gz  //下载到src   ...

  6. 006. SSO 单点登录(同域SSO/跨域SSO)

    SSO 单点登录:一次登录,处处登录. 只需在一个登录认证服务下进行登录后,就可访问所有相互信任的应用 同域 SSO 1. session-cookie机制:服务端通过cookie认证客户端. 用户第 ...

  7. 我的世界 ParaCraft 结合开源地图 OpenStreetMap 生成3D校园的方法简介

    我的世界ParaCraft结合开源地图OpenStreetMap生成3D校园的方法简介 版本1.0 日期2019.2.3 作者Ray (82735589@qq.com) www.TimeGIS.com ...

  8. Jmeter使用JDBC请求简介

    1.现在oracle或mysql的jdbc然后放到jmeter的lib路径下 2.添加jdbc默认请求控件. 3.添加jdbc请求 4.发送 5.出现ORA-00911错误是由于sql语句错误,注意别 ...

  9. [20190416]process allocation latch.txt

    [20190416]process allocation latch.txt --//看链接:http://andreynikolaev.wordpress.com/2010/12/16/hidden ...

  10. 从0开始的Python学习016异常

    简介 当你的程序不能正常运行的时候,Python会在控制台打印一段提醒,告诉你一个错误,这个错误就是异常. 错误 我在控制台写了一段无效的代码,将print()的括号去掉,在执行这条语句的时候,系统提 ...