伴生对象使用细节和最佳实践|学习笔记

简介: 快速学习伴生对象使用细节和最佳实践。

开发者学堂课程【Scala 核心编程-基础伴生对象使用细节和最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/8985


伴生对象使用细节和最佳实践

 

内容介绍

一、伴生对象的使用细节

二、案例讲解

 

一、伴生对象的使用细节

对于伴生对象的使用细节,本章节总共总结了九点,如下:

1Scala 中伴生对象采用 object 关键字声明,伴生对象中声明的全是"静态"内容,可以通过伴生对象名称直接调用。意识就是说静态内容就是模拟的,对于是怎么模拟的通过下面的流程图进行讲解:

image.png

如图所有实现的静态都是围绕这个 MODULE,也就是说可以创建很多的 ScalaPerson,数量不限制,但是Scala 里面的静态内容只能通过他的伴生对象中类的 MODULE 去调用,而 MODULE 是一个 static 类型,相当于只有一个,而静态的本质也只有一个。只要访问 ScalaPerson 中的内容,入口只有一条线,这条线就是 static final MODULE$,所以就能保证实现的是静态效果。

2、伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。那么如果把 ScalaPerson 改为ScalaPerson2,那么 ScalaPerson 和 ScalaPerson2就没有关系了,而此时编译后 ScalaPerson2在底层会生成ScalaPerson2.class,ScalaPerson 会默认生成空的 ScalaPerson.class 和 ScalaPerson$.class。代码如下:

//伴生类

class Scalaperson { //底层 ScalaPerson2.class

var name : String =_

}

//伴生对象

object ScalaPerson { //默认ScalaPerson.class ScalaPerson$. class

var sex : Boolean = true

def sayHi(): Unit = {

println("object ScalaPerson sayHI~~" )

}}

3、伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。比如如下流程图就是通过伴生名称ScalaPerson.sayHi()进行调用的,而底层是用伴生对象类里面对应的那一个 MODULES 静态属性进行调用的。

image.png

4、从语法角度来讲,所谓的伴生对象其实就是类的静态方法和成员的集合

5从技术角度来讲,scala 还是没有生成静态的内容,只不过是将伴生对象生成了一个新的类,实现属性和方法的调用。对于 Scala 并没有生成静态的内容是因为伴生对象中生成的都是静态内容,代码如下:

object ScalaPerson { //

var sex : Boolean = true

def sayHi(): Unit = {

pridtln("object ScalaPerson sayHI~")

}}

而代码中 sex 和 sayHi()在底层生成的并不是静态的,仍然是一个普通的属性,反编译看源码为:

package com. atguigu. chapter08;

public static final MODULES:

private boolean sex;

public void sayHi() {

所以并没有生成静态内容,只是调用了 static final MODULES 完成了静态效果。

6、从底层原理看,伴生对象实现静态特性是依赖于 public static final MODULES 实现的。

7伴生对象的声明应该和伴生类的声明在同一个源码文件中(如果不在同一个文件中会运行错误!),但是如果没有伴生类,也就没有所谓的伴生对象了,所以放在哪里就无所谓了。

8如果 classA 独立存在,那么A就是一个类,如果 object A 独立存在,那A 就是一个"静态"性质的对象[即类对象],在 objectA 中声明的属性和方法可以通过 A.属性和 A.方法来实现调用

9当一个文件中,存在伴生类和伴生对象时,文件的图标会发生变化。如下图,当文件中内容只有class Test 时,最左 Project 板块中 Test 目录图标为全蓝色,而添加内容 object Test 后,图标改变为一半蓝一半黄,说明文件中有伴生对象和伴生类:

image.png

image.png

 

二、案例讲解

下面使用伴生对象快速解决小孩完游戏案例

案例:如果设计一个 var total Int 表示总人数在创建一个小孩时,就把 total 加1,并且 total 是所有对象共享的就可以,下面使用伴生对象来解决

实现代码:

package com. atguigu. chapter08

object ChildJoinGame {

def main(args: Array[String]): Unit = {

//创建三个小孩

val child0 = new Child02("白骨精")

val child1 = new Child02("蜘蛛精" )

val child2 = new Child02(" 黄鼠狼精")

Child02. joinGame( child0)  //创建小孩,让小孩加入到游戏中

Child02. joinGame(child1)

Child02. joinGame( child2)

Child02. showNum()  //输出总共的小孩,理论上为3个

}}

class Child02(cName: String) {  //因为有很多小孩,而且每个小孩都有名字,所以再写上主构造器

var name = cName  //定义变量为 name,赋值为 cName

object Child02 {

//统计共有多少小孩的属性

var totalChildNum = 0

def joinGame(child: Child02): Unit = {//定义 joinGame用于接收小孩

printf("%s小孩加入了游戏\n",child .name )  //然后进行格式提示信息

//totalchildNum加1

totalchildNum += 1

}

def showNum(): Unit = {  //定义静态方法为 showNum

printf(" 当前有%d小孩玩游戏\n",totalChildNum)

}}

运行结果:

D: \program\jdk8\bin\java

白骨精 小孩加入了游戏

蜘蛛精 小孩加入了游戏

黄鼠狼精 小孩加入了游戏

当前有3小孩玩游戏

相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
为什么大型语言模型都在使用 SwiGLU 作为激活函数?
SwiGLU可以说是在大语言模型中最常用到的激活函数,我们本篇文章就来对他进行详细的介绍。
1494 9
|
Linux C语言 Windows
MingW编译virt-viewer
在http://www.spice-space.org/download.html可以下载到windows版本的virt viewer virt-viewer-x86-0.5.7.msi和virt-viewer-x64-0.5.7.msi是使用MingW编译出来的,源码就是使用virt-viewer-0.5.7.tar.gz 如果需要定制virt viewer,就需要从源码编译出可执行的二进制码,本文就是描述编译windows版virt viewer的过程。
2066 0
|
2月前
|
缓存 Ubuntu 安全
如何在Ubuntu中移除Snap包管理器
以上步骤涉及系统深层次的操作,可能会对系统稳定性和安全性产生影响。在执行这些操作之前,请确保您了解每个步骤的具体含义,并考虑所有潜在的风险。此外,这些步骤可能会随着Ubuntu系统的更新而变化,请根据您的具体系统版本进行调整。
443 17
|
9月前
|
人工智能 安全 前端开发
github和npm开启2FA双重身份验证无法登陆
随着安全需求提升,许多应用如GitHub和npm已强制启用2FA(双重身份验证)。2FA通过用户名、密码及动态验证码增强账号安全性。若手机丢失或TOTP应用失效,可使用开启2FA时生成的recovery code登录并重新绑定。推荐使用大厂的TOTP工具,如Microsoft Authenticator、Google Authenticator等,避免小应用停服风险。若无备份码,只能通过人工申诉找回账号。
690 15
github和npm开启2FA双重身份验证无法登陆
|
10月前
|
存储 算法 测试技术
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
|
JSON Oracle 关系型数据库
|
存储 人工智能 运维
基于最小模块化架构实现业务可持续增长
基于最小模块化架构实现业务可持续增长
459 0
|
存储 弹性计算 运维
基于spring boot框架的云上微服务整体监控方案
从各个层面介绍了阿里云上监控基于spring boot框架的微服务的产品和服务。这是一种快速有效的搭建整体监控体系的方案。对于中小企业,可以快速搭建起一套完整的体系以对服务运行环境从基础设施到应用性能进行运行态掌控、数据分析、监控报警、故障定位。
3438 0
|
分布式计算 关系型数据库 MySQL