概念

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

作用

为什么会有object这个概念,因为scala没有static关键字,无法创建单例,等原因

用法

singleton object

//object就是个单例,此处单例名字叫做Logger1.
object Logger1 {def info(msg: String): Unit = println(s"INFO:$msg")
}class MID {//单例的方法可以像java中静态类的方法一样调用Logger1.info("created objects");
}object Test2 {def main(args: Array[String]): Unit = {//可以像调用静态类的方法一样调用object中的方法Logger1.info("hello,world") //INFO:hello,world//创建新的MID对象时val m = new MID() //INFO:created objects}
}

证明object是个单例的方式

object Test extends App {//证明的确是个单例,因为创建2个是相同的private val singletone1: Singletone.type = Singletone.getInstance()private val singletone2: Singletone.type = Singletone.getInstance()println((singletone1 == singletone2))//true
}
//obejct 本身就是个单例,把自己返回下就行了
object Singletone{val singletone: Singletone.type =Singletonedef getInstance(): Singletone.type ={singletone}
}

Companion objects

scala中,与类名相同并且用object修饰的对象时 伴生对象.class和companion之间可以互相访问私有的方法和属性,他们必须在同一个源文件中

简而言之,就是可以互相访问,不管私有还是公有. 如果不是伴生对象,那只能是单例对象了,可以通过类名.方法的形式访问

class Compaion {var id = 0private val name = "xiaohong"private[this] var age = 18private def getAge: Int = age//访问伴生object的私有属性addressdef getAddress(): Unit = println(Compaion.address)
}object Compaion {private val address = "beijing"def main(args: Array[String]): Unit = {val co = new Compaion()//访问伴生class的属性idco.id = 1println(co.id) //1//访问伴生class的属性nameprintln(co.name) //xiaohong//访问伴生class的私有方法println(co.getAge) //18co.getAddress() //beijing}
}

apply方法在伴生对象中的应用

用了后创建伴生class对象时可以少些个new,apply 方法在源码中的应用还是比较多的.


object Test extends App {//创建对象时无需new,传参实际上传给了apply方法val m=Man("李明",20)m.showinfo()//李明 is 20 years old
}//构造函数私有.这里其实有点像单例了
class Man private(name:String,age:Int){def showinfo(): Unit ={println(s"$name is $age years old")}
}
//伴生object中定义apply方法,后续创建对象就会比较简单
object Man{def apply(name: String, age: Int): Man = new Man(name, age)
}

如果是个case class,可以不用写apply方法,系统会自动在其伴生类中生成一个apply方法!

object Test extends App {val m = Man("李明", 20)m.showinfo() //李明 is 20 years old
}case class Man private(name: String, age: Int) {def showinfo(): Unit = {println(s"$name is $age years old")}
}object Man {}

App对象

可以不用写main方法就能执行,原理看源码

object HelloApp extends App{println("hello world")//hello world
}

总结

  • 单例object,像静态类一样用
  • 伴生object,可以和伴生class互相访问
  • apply方法,创建对象不需要new关键字!
  • case class默认会给其伴生对象生成apply方法

scala单例object与伴生object入门相关推荐

  1. Scala单例对象(伴生对象)

    概念 Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念).但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该 ...

  2. 【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )

    文章目录 I . 单例的懒汉式与恶汉式 II . Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 ...

  3. Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象

    1. 类 1.1. 类的定义 package cn.toto.scala.day2/*** 在Scala中,类并不用声明为public类型的.* Scala源文件中可以包含多个类,所有这些类都具有共有 ...

  4. Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数

    探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...

  5. java单例设计及其在jdk中的应用

    什么是单例 单例是要解决一个类只能有一个对象的问题,为什么要做这个限制? 单例如何实现 如何实现单例,把constructor私有化,不能new了,此时一个实例都没有了 constructor虽然私有 ...

  6. python 单例类

    1.创建单例类 class CCP(object):def __new__(cls,*args,**kwargs):if not hasattr(cls,'_instance'): # 如果类对象中没 ...

  7. 静态内部类实现单例_为什么用枚举类来实现单例模式越来越流行?

    前言 单例模式是 Java 设计模式中最简单的一种,只需要一个类就能实现单例模式,但是,你可不能小看单例模式,虽然从设计上来说它比较简单,但是在实现当中你会遇到非常多的坑,所以,系好安全带,上车. 单 ...

  8. python3的配置文件类单例实现_单例模式的几种实现方式及对比

    来源:博客园 作者:为何不是梦 链接:https://www.cnblogs.com/ibigboy/p/11423613.html 所谓单例就是在系统中只有一个该类的实例. 单例模式的核心分以下三个 ...

  9. Django验证码*短信验证码之2-容联云通讯短信平台(联云通讯短信平台介绍、容联云通讯Python SDK、封装发送短信单例类)

    容联云通讯短信平台介绍 容联云通讯网址:https://www.yuntongxun.com/ 容联云管理控制台 容联云创建应用 容联云通讯Python SDK https://doc.yuntong ...

最新文章

  1. 工具类的方法怎么引用_Hutool中那些常用的工具类和方法
  2. Easyui 让DataGrid适应浏览器宽度
  3. 2020\Simulation_1\2.约数个数
  4. .NET开发框架(三)-高可用服务器端设计
  5. UDK编辑器 49条小提示(转)
  6. 使用C语言计算utf-8字符串长度 和取子字符串-转
  7. 如何在C / C ++中使用continue语句
  8. IO中的阻塞、非阻塞、同步、异步概念分析详解(通俗易懂)
  9. Hibernate 中 set 里的属性及定义
  10. C语言--------学生管理系统(源代码)
  11. WINCC的一套教程 有视频 有VBS开发基础 Excel导出
  12. Python_bug之Numpy问题
  13. 网络营销策略常见方法有哪些?
  14. 华硕主板如何设置开机自启_华硕主板每次开机都进bios 华硕主板开机总是自动进入了BIOS设置界面怎么办?...
  15. python获取cpu温度_Python如何读取CPU和GPU的温度?
  16. 零售商贩mysql表设计:banner+banner_item+image关联表(轮播图表)
  17. win10下安装华为Atals USB虚拟网卡驱动
  18. LeetCode-378.有序矩阵中第k小的元素、二分查找
  19. 一种改进的鲸鱼优化算法
  20. Java管理扩展指南之MBean简介

热门文章

  1. 低秩矩阵完备_矩阵之芯 SVD: 基本应用以及与其他分解的关系
  2. web后端语言_web前端学习路线图_快速入门web前端学习路线图
  3. linux下备份msyql数据库
  4. 广数系统980tdb系统说明书_不同数控系统中各个倒角指令的用法
  5. linux 内核dump,linux内核调试技巧之一 dump_stack【转】
  6. 区块链开发指南_区块链软件开发详解
  7. linux新建java文件夹删除不了怎么办_Linux无法删除文件夹 Device or resource busy
  8. 怎样在接口地址中添加请求头参数_jmeter5.3做soap接口性能测试配置
  9. linux上数据库导入与导出(mysql)
  10. c语言上机实验作业答案,第十二次C语言上机实验参考答案