概念

Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概
念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象
来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴
生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。

单例对象

基本语法

object Person{ val country:String="China"
}

说明
(1)单例对象采用 object 关键字声明
(2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
(3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

apply方法

说明

(1)通过伴生对象的 apply 方法,实现不使用 new 方法创建对象。
(2)如果想让主构造器变成私有的,可以在()之前加上 private。
(3)apply 方法可以重载。
(4)Scala 中 obj(arg)的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。用
以统一面向对象编程和函数式编程的风格。
(5)当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构
建对象时,调用的其实时伴生对象的 apply 方法。

案例实操

package chapter06object Test11_Object {def main(args: Array[String]): Unit = {//    val student11 = new Student11("alice",18)
//    student11.printInfo()val student1 = Student11.newStudent("alice",18)student1.printInfo()val student2 = Student11.apply("bob",18)student2.printInfo()//名称为aplly时候,可省略val student3 = Student11("bob2",18)student3.printInfo()}}//定义类
class Student11 private(val name: String, val age: Int){def printInfo(): Unit ={println(s"student: name=$name, age=$age, school=${Student11.school}")}}
//伴生对象
object Student11{val school: String = "atguigu"//定义一个类的对象实例的创建方法def newStudent(name: String, age: Int): Student11 = new Student11(name, age)def apply(name: String, age: Int): Student11 = new Student11(name, age)
}

扩展:在 Scala 中实现单例模式的案例

package chapter06object Test12_Singleton {def main(args: Array[String]): Unit = {val student1 = Student12.getInstance()student1.printInfo()println(student1)val student2 = Student12.getInstance()student2.printInfo()println(student2)}}//定义类
class Student12 private(val name: String, val age: Int){def printInfo(): Unit ={println(s"student: name=$name, age=$age, school=${Student11.school}")}}//饿汉式的单例设计模式
//伴生对象
//object Student12{//
//  private val student: Student12 = new Student12("alice",18)
//
//  def getInstance(): Student12 = student
//
//}//懒汉式
object Student12{private var student: Student12 = _def getInstance(): Student12 = {if (student == null){//如果没有对象实例的话就创建一个student = new Student12("bob",18)}student}
}

Scala单例对象(伴生对象)相关推荐

  1. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(第五章:基本引用类型,原始值包装类型,单例内置对象)

    第五章:基本引用类型 引用值(或者对象)是某个特定引用类型的实例.新对象通过使用new操作符后跟一个构造函数(constructor)来创建. 5.1 Date 这里不对Date进行详细深入,仅基于书 ...

  2. scala什么是单例对象_Scala单例和伴侣对象

    scala什么是单例对象 Scala中的单例对象 (Singleton objects in Scala) Scala being an object-oriented programming lan ...

  3. scala单例object与伴生object入门

    概念 object是一个特殊的类,特殊在这个类只有一个实例.并且是懒加载的,就是用到的时候才创建. 当对象定义于顶层时(即没有包含在其他类中),单例对象只有一个实例. 当对象定义在一个类或方法中时,单 ...

  4. 字节Scala面试题(2) --- 伴生对象

    今天继续之前字节面试的另外一个问题 --- 伴生对象. ----------分界线:面试问题---------- 请描述一下,Scala中伴生对象编译成.class文件后与伴生类的关系. ------ ...

  5. Objective-C设计模式——单例Singleton(对象创建)

    单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但 ...

  6. java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...

    3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...

  7. Kotlin学习历程——对象声明与伴生对象

    Kotlin语言中文站 对象声明 如下代码写法称为对象声明: object UserInfoManager {//用户类型val userType : Int = 0//获取用户登录信息fun get ...

  8. 2021年大数据常用语言Scala(二十九):scala面向对象 单例对象

    目录 单例对象 定义object - 掌握 伴生对象 - 掌握 apply方法 - 掌握 main方法 单例对象 Scala中没有static关键字,但是它支持静态 如果要定义静态的东西,统统定义到o ...

  9. 四, Scala 伴生对象, 特质

    文章目录 四, Scala 伴生对象和伴生类 4.1 单例对象和伴生对象 4.1.1 什么是单例对象? 4.1.2 如何使用Scala的伴生对象和伴生类来实现单例模式? 4.1.2 apply方法 4 ...

最新文章

  1. Java8 - 使用CompletableFuture 构建异步应用
  2. MySQL从原理到实践,一篇从头到尾讲清楚
  3. python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI
  4. 流畅的python 数据模型
  5. java一个引用多大_为什么Java 8为方法引用引入了一个新的“::”运算符?
  6. 用Python自动发送邮件
  7. TCP滑动窗口协议作用
  8. MULTISIM下载安装
  9. 【HAT】 Activating More Pixels in Image Super-Resolution Transformer
  10. Debian10 双显卡切换
  11. HDU 2102 拯救公主
  12. Android底层网络防火墙,Android系统中实现网络防火墙的方法
  13. Pygame显示文字
  14. 管理计算机域的内置账户怎么取消,如何删除供来宾访问计算机或访问域的内置账?...
  15. BuildAdmin后台管理系统配置QQ邮箱
  16. [附源码]计算机毕业设计Python架构的博客平台设计(程序+源码+LW文档)
  17. java 原型图_一张图搞懂原型、原型对象、原型链
  18. 前端报错:net::ERR_ABORTED 404
  19. C# Socket客户端采用双线程断网重连断线重连)
  20. 74ls190芯片制作的48进制计数器的计算机图,六十进制计数器综合设计

热门文章

  1. 【 Vivado 】输出延迟约束实例
  2. 【 Notes 】RFID Preliminary Introduction
  3. 【 MATLAB 】Fourier Analysis and Filtering frame(傅立叶分析和滤波 框架)
  4. 时讯无线为你提供快速的上网设备
  5. YII2框架表单-model(验证)-HTML_help部件 URL_help部件 以注册页面为实例
  6. 算法学习之路|D进制的A+B
  7. ZStack源码剖析之核心库鉴赏——FlowChain
  8. win32下PE文件分析之节表
  9. 32位so库兼容64位使用
  10. 功能规格说明书Version2