Scala基础(二)
单例对象(object)
Scala的类中无法定义静态成员,即无static关键字。如何像Java一样表达类的静态成员变量、成员方法与静态代码块?
Scala解决方案:单例对象
- 使用“object”关键字声明,可包含变量、方法与代码定义
- 单例对象中的成员变量、成员方法通过单例对象名直接调用
- 单例对象第一次被访问时初始化,并执行全部代码块
- 单例对象不能new,且无构造参数
- 程序入口main()方法必须定义在单例对象中
- 单例对象与同名类定义在同一文件中时形成绑定关系
//定义一个单例对象
object Student{def s(name:String,age:Int):Unit = print(name+","+age)
}
伴生
伴生即单例对象与同名类定义在同一文件中时形成绑定关系
- 前提:同一个文件的class和object 名字相同,伴生类和伴生对象在同一个文件中,名字相同
- 同名类称为单例对象的伴生类(class)
- 单例对象称为同名类伴生对象(object)
伴生类与伴生对象可相互访问各自私有成员
伴生对象可为伴生类增加静态成员
伴生类中可以在域中直接使用:类名.方法 的方式调用伴生对象中的方法
在main方法中:
1.使用伴生类直接建立一个实例,属性和方法只能是class域中的
2.使用伴生对象提供的实例,属性和方法只能是object域中的
3.伴生对象中定义apply方法可以不使用new新建实例
// 互为伴生类、伴生对象
class Oop1{ } // 类
object Oop1{ } // 对比java中的静态类,可以理解为对象// 不是伴生关系
class Oop1{ }
object Oop{ }
创建语法
伴生对象中的属性可以直接使用类名进行调用;伴生类中的属性,需要先实例化对象,才能够进行调用。
没有class,只有object则是单例模式类。
scala中伴生类&伴生对象的语法如下:
class Test{val a:Int = 10;var b:Int = 2;
}object Test{val object_v1:String = "变量1";def main(args: Array[String]): Unit = {// 注:只有伴生对象中可以定义主函数,类似于static修饰println("伴生对象变量:" + Test.object_v1);println("伴生类变量:" + (new Test()).a);}
}
apply()
apply()是一个语法糖,直接调用类(对象)名称时候,默认执行的是该类(对象)的apply()方法。
目的是为了适应函数式编程的编码规范,可以在伴生对象的apply()中new一个对象,使用案例如下:
object Test{def apply():Test= new Test();def main(args: Array[String]): Unit = {// 变量复制,直接可以实例化对象,不需要再new了val ad1 = Test();}
}
案例
//伴生类和伴生对象在同一个文件中,名字相同,class类称为object的伴生类,object称为class的伴生对象//定义伴生类
class Person(uname:String, uage:Int) { //Scala主构造函数,主构造函数定义在类的头部println("class 进入到Person的class类中")var name:String = unamevar age:Int = uageprivate var address:String = "亚洲"def this(){ //从构造方法 this("xxx",0)println("class this() 从构造方法")}def this(age:Int){this("XXX",age)}def this(name:String){this(name,0)}println("class 变量定义完成,准备定义方法")//定义伴生类中的方法def printMsg(): Unit ={println(Person.name+" "+Person.age+" "+address)Person.showMsg()}println("class类一次游,准备离开Person类")
}//定义伴生对象
object Person{ //伴生对象 相当于java中的Staticprintln("object 进入到Person伴生对象中。。。")private val name:String = "中国"private val age:Int = 71//定义apply方法def apply(uname: String, uage: Int): Person = new Person(uname, uage)def apply(uname: String): Person = new Person(uname)def apply(uage: Int): Person = new Person(uage)def apply(): Person = new Person()println("object 变量定义完成,准备定义方法")def showMsg():Unit={println(Person.name+" "+Person.age)}//定义方法,获得class中的属性def showBSClass(p:Person): Unit ={println(p.address)}//main方法def main(args: Array[String]): Unit = {println("object main 进入到main方法中")//使用object的apply方法新建对象,只能使用class中的属性和方法val po1 = Person("zs",21) //相当于:val person = Person.apply("aa",12)val po2 = Person()val po3 = Person("kb09")val po4 = Person(12)Person.showBSClass(po1)//使用从构造方法var p1:Person = new Person()var p2:Person = new Person(21)var p3:Person = new Person("zhangsan")//使用class新建对象,只能使用class中的属性和方法var personNew:Person = new Person("zs",21)//使用object提供的对象,只能使用object中的属性和方法var personObj = PersonpersonObj.showMsg()personNew.printMsg()}println("object 伴生对象一次游结束")
}
相关文章:

Scala基础(二)
单例对象(object) Scala的类中无法定义静态成员,即无static关键字。如何像Java一样表达类的静态成员变量、成员方法与静态代码块? Scala解决方案:单例对象 使用“object”关键字声明,可包含变量、方法与…...

Python 生产者消费者模型是什么?
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注! 作者| 慕课网精英讲师 朱广蔚 1. 简介 生产者和消费者问题是线程模型中的经典问题: 生产者和消费者共享同一个存储空间生产者往存储空间中添…...

手机银行评测系列:北京银行“京彩生活”7.0从用户视角出发,实现沉浸式体验重塑
易观:2023年3月28日,北京银行发布“京彩生活”APP 7.0版本,从旅程再造、特色金融、场景生态、平台联动、协同经营、体验管理和安全守护七大方面全面升级,从用户视角出发,重塑用户旅程,简化操作流程…...

ZJYC2023 浙江省大学生程序设计竞赛校内选拔赛部分题解 C J B L
ZJYC2023 浙江省大学生程序设计竞赛校内选拔赛部分题解 C J B L 难度分布: 签到:CJ Easy:BL Midium:IAGKFE Hard:DH 题解: 签到:CJ C - ^{-1} 参考代码: #include<bits/std…...

百科创建:7种有效的百科词条创建技巧
百科词条是互联网上最常见的知识信息资源之一,它们是人们查找信息的主要途径之一。创建一个高质量的百科词条并不是一件容易的事情,需要一些技巧和经验才能做到。下面是一些创建百科词条的技巧: 一、确保词条的独特性 在创建百科词条之前&…...

ThreeJS-dat.gui界面控制颜色、隐藏、位置(六)
下载组件dat.gui npm install dat.gui -S 引入组件 import * as dat from dat.gui //界面控制 代码: <template> <div id"three_div"> </div> </template> <script> import * as THREE from "three"; import {O…...

接口自动化测试,完整入门篇
目录 1. 什么是接口测试2. 基本流程3. 需求分析4. 用例设计5. 脚本开发6. 结果分析7. 完整脚本8. 参考资料1. 什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及…...

利用ControlNet重新定义你的AI姿势
利用ControlNet重新定义你的AI姿势 前段时间给大家分享了如何利用colab实现AI绘画自由,现在Stable Diffusion WebUI Colab TW又更新了不少新功能。最重要的是可以通过谷歌硬盘的快捷方式导入模型,极大的节省了谷歌硬盘容量。 众所周知,谷歌…...

中医药NER命名实体识别基于SPANNER方式
一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2023.3.5 Last edited: 2023.3.5 导读 本文使用SPANNER方式实现对中医药进行实体识别,采用focal loss 进行优化。 本文章作用防止安静…...

Vue必掌握
目录 一、组件通信方式 二、v-if和v-for 三、生命周期 1、描述 2、setup和created谁先执行 3、setup中为什么没有beforeCreate和created 四、双向绑定 v-model 1、定义 2、本质,原理 3、好处 五、如何扩展一个组件 1、mixins 缺点 2、slot插槽 3、e…...

SSM部分
声明式事务 从之前的事务控制的代码中可以看出,是有规律可循,代码的结构基本是确定的,所以框架就可以将固定模式的代码抽取出来,进行相关的封装。 封装起来后,我们只需要在配置文件中进行简单的配置即可完成操作。 …...

【Springboot系列】Springboot接管所有Controller,magic-api源码阅读
系列文章地址:Spring Boot学习大纲,可以留言自己想了解的技术点 最近在项目中使用了一个第三方的包 magic-api,节省了很多的时间,整体来说就是只用写sql就好了,不用写service,controller那些,全部统一处理了。 具体的使用大家可以搜索下,网上到处都是,建议去官网看。…...

二、LED子系统数据结构详解
个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、核心数据结构1.1 gpio_led_platform_data1.2 gpio_leds_priv1.3 gpio_led1.4 gpio_led_data1.5 led_…...

Kubernetes(11):数据存储详解
在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。 Volume是Pod中能够被多个容器访问的共享目录…...

随想录Day43--动态规划: 1049. 最后一块石头的重量 II , 494. 目标和 , 474.一和零
最后一块石头重量转化为将一个集合分隔成两个集合,两个集合之间的差值最小,就是最后剩下最小的石头重量。这里可以求集合的一个平均值,如果正好等于平均值,说明可以抵消,这时候重量为0,如果不行,…...

Qt中对TCP粘包的处理
当时用TCP协议传输数据时,经常出现粘包的现象 当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方? 1、服务器?服务器已经发出数据了 2、网线?数据应该在内存,怎…...

贪心-单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时,我们称这个整数是单调递增的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输出: 1234示例 3: 输入…...

你真的会用搜索引擎吗?
作为一名在校大学生,对于搜索资料这一件事深有体会,特别是在期末考试突击的时候,如何利用搜索引擎,快速找到自己想要的知识,快速理解这个知识点,想必是每位大学生的必备技能了。 我们在学习一个知识点的过…...

KDCJ-20kV冲击耐压测试仪
一、产品简介 KDCJ-20kV冲击耐压测试仪是电力设备高压试验的基本项目之一,电力设备在设计、制造及修缮之后都要求进行冲击试验以验证或检验。因此,冲击电压试验设备有着广泛的应用,在工厂、研究机构及大专院校的高压试验室中都可以看到不同规…...

【Mybatis源码分析】TypeAliasRegistry源码分析
TypeAliasRegistry源码分析一、引入类型别名二、typeAlias 的三种配置方式三、TypeAliasRegistry源码分析三种配置方式源码解析校验过程Mybatis默认的别名配置四、总结一、引入类型别名 当配置 XML 文件,需要指明Java类型时,类型别名可替代Java类型的全…...

节点高负载
如何判断节点高负载? 可以通过 top 或 uptime 来确定 load 大小,如果 load 小于 CPU 数量,属于低负载,如果大于 CPU 数量 2~3 倍,就比较高了,当然也看业务敏感程度,不太敏感的大于 4 倍算高负载。 排查思路 观察监控:通常不是因为内核 bug 导致的高负载,在卡死之前…...

动态规划(一) part1
T1:一个数组 中的最长 升序 子序列 的长度 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组…...

Ubuntu显卡报错:Failed to initialize NVML Driver/library version mismatch
问题描述 输入指令nvidia-smi的时候,出现如下: Failed to initialize NVML: Driver/library version mismatch看起来好像是版本不匹配,在网上查了很多都没有解决问题,重启也不行,结果证明最好的办法是重新安装cuda。…...

JAVA企业电子采购系统源码:采购过程更规范,更透明
满足采购业务全程数字化, 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 电子招标采购,是指在网上寻源和采购产品和服务的过程。对于企业和企业主来说,这是个既省钱又能提高供应链效率的有效方法…...

5.5G产业再提速!高通5GAdvanced-ready芯片商用终端下半年面世
MWC2023大会召开在即,5GAdvanced产业再添重磅消息!2月15日,高通宣布推出全球首个5GAdvanced-ready基带芯片——骁龙X755G调制解调器及射频系统,支持毫米波和Sub-6GHz频段,带来网络覆盖、时延、能效和移动性等全方位的提…...

基于B站王阿华的视频——为什么当下自媒体都在制造焦虑以及如何摆脱
观后笔记2.0——一些深入的思考 1.情绪大约在两千万年前,哺乳脑统治期间诞生。 2.情绪分为积极情绪和负面情绪。决定某种情绪的出现取决于安全感等级。 自媒体制造负面情绪,想尽办法挑起情绪,吸引流量 安全感充足时,由积极情绪…...

一、Docker介绍:
Docker官方网站:https://www.docker.com/ Docker容器技术是虚拟化技术的一个分支,虚拟化技术一般分为两种: 硬件级虚拟化(hardware-level-virtualization) :是运行在硬件之上的虚拟化技术,它的核…...

Vue进阶(一篇进入Vue3的世界)
文章目录一、初识Vue3二、Vue3新语法糖setup三、响应式数据函数3.1 ref函数3.2 reactive函数3.3 ref和reactive函数的异同四、Vue3的响应式原理五、语法更新5.1 Vue3使用computed计算属性5.2 Vue3使用watch监视属性的注意点5.2.1 监视ref对象5.2.2 监视reactive对象5.2.3 监视嵌…...

功能测试的分类,分别有什么作用?
目录 前言 一、链接测试 二、表单测试 三、搜索测试 四、删除测试 五、cookies/session测试 六、数据库测试 七、峰值测试/容量测试 八、相容性测试/安全测试 前言 功能测试主要包括链接测试、表单测试、搜索测试、删除测试、cookies、session测试、数据库测试等部分…...

51单片机学习笔记_14 红外遥控
红外传感器 遥控器通过红外 LED 发送调制后的信号,开发板上的红外接收模块接收遥控器的红外线。 单工异步,940nm 波长(还有一种 250nm 的N,可见光),EC 通信标准。 38KHz:红外线频率。 IN&…...