聊聊 Scala 的伴生对象及其意义
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 的伴生对象及其意义的更多相关文章
- scala 类,伴生对象
1.属性的定义 编写一个PersonS类,并在其中定义一些属性,通过PersonS.scala 编译后的情况查看,可以知道不同修饰符修饰的属性分别会生成什么方法(set,get) package co ...
- scala伴生对象
package com.test.scala.test /** * 伴生对象指的是在类中建立一个object */ class AssociatedObject { private var count ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...
- Scala单例对象、伴生对象实战详解
1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...
- Scala学习笔记之伴生对象
所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰. 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的 ...
- scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类
一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...
- Scala伴生类和伴生对象
单例对象与类同名时,这个单例对象被称为这个类的伴生对象,而这个类被称为这个单例对象的伴生类.伴生类和伴生对象要在同一个源文件中定义,伴生对象和伴生类可以互相访问其私有成员.不与伴生类同名的单例对象称为 ...
- Scala学习笔记(二):object、伴生对象和基本类
object object 是只有一个实例的类.它的定义与Java中的class类似,如: // 单例对象 object AppEntry { def main(args: Array[String] ...
- Scala单例对象和伴生对象
1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...
随机推荐
- Powershell:关于PSCustomObject你想知道的一切(译)
PSCustomObject是Powershell里非常重要的一个工具,我们先从基础开始然后再循序渐进讲到一些更高级的话题.PSCustomObject旨在于用简单的方法来创建结构化数据.下面的第一个 ...
- TensorFlow tutorial
代码示例来自https://github.com/aymericdamien/TensorFlow-Examples tensorflow先定义运算图,在run的时候才会进行真正的运算. run之前需 ...
- [JavaScript] 函数节流(throttle)和函数防抖(debounce)
js 的函数节流(throttle)和函数防抖(debounce)概述 函数防抖(debounce) 一个事件频繁触发,但是我们不想让他触发的这么频繁,于是我们就设置一个定时器让这个事件在 xxx 秒 ...
- sublime text3插件解决输入法不跟随的问题
快捷键ctrl + shift +p 输入 install package 回车,调出插件搜索器, 在搜索栏中输入 IMESupport 回车安装插件. 即可解决问题.
- 校园生活app结对开发第二天
昨天进行了android studio的安装与配置遇到很多问题,在gradel处遇到很多问题,安装版本错误等等,在百度和书籍的帮助下成功安装 今天要做登陆界面开发
- 成为一名Java架构师的必修课
一.热门框架源码学习 设计模式篇 Spring5源码解读篇 Mybatis篇 SpringBoot2篇 二. 微服务架构 架构设计篇 BAT互联网架构这些年的演进分析 国内外常见分布式系统架构状况介绍 ...
- 高并发系统保护~ing
由于公司业务发展,需要考虑一些高并发系统保护的问题,整理记录一下. 当发现你的系统出现访问卡顿,服务器各种性能指标接近100%(如果一个初创型企业系统正常运行情况下出现这个问题,那么应该恭喜你,你懂得 ...
- 重写Ext中的typeOf函数
重写Ext中的typeOf函数来解决Ext JS中typeOf对字符串对象.元素节点.文本节点.空白文本节点判断并不准确的问题 重写的typeOf函数使用自己实现的TypeOf函数2中的代码 测试代码 ...
- phpstorm:如何设置代码自动换行
File->Settings->Editor 点击general,如下如所示: 勾选 “ Use soft wrap in editor ” ,这样就可以自动换行了
- html文档知识补充
13.form表单(*******) 功能:前后数据交互,帮你提交任意的数据 input通过控制type属性来展示不同的获取用户输入的页面效果 type属性总结: text:纯文本 password: ...