伴生对象和伴生类的小结|学习笔记

简介: 快速学习伴生对象和伴生类的小结。

开发者学堂课程【Scala 核心编程-基础伴生对象和伴生类的小结】学习笔记,与课程紧密联系,让用户快速学习知识。

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


伴生对象和伴生类的小结

 

内容介绍

一、引出伴生对象

二、Scala 中静态的概念-伴生对象

三、伴生对象的小结(总结了9点)

四、最佳实践-使用伴生对象完成小孩玩游戏

 

一、引出伴生对象

在上面章节中讲解了面向对象编程的高级特性,首先通过一个案例提出了为什么需要静态相关的问题,问题如下:

有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?

而提出问题的主要目的就是让大家思考解决之道,从而引出要讲的知识点,而使用面向对象的思想编写程序会发现根据现有的知识解决不了问题。当时使用的解决方法是在main中定义一个变量,来一个小孩就加入一个这样肯定是不行的,所以提出了伴生对象的概念。

java 的静态概念

回顾下 Java 的静态概念

public static 返回值类型方法名(参数列表) {方法体}

静态属性...

说明: Java 中静态方法并不是通过对象调用的,而是通过类对象调用的,所以静态操作并不是面向对象的。

 

二、Scala 中静态的概念-伴生对象

Scala 语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在 Scala 中没有静态的概念)。但是为了能够和 Java 语言交互(因为 Java 中有静态概念),就产生了一种特殊的对象来模拟类对象,称之为类的伴生对象。这个类的所有静态内容都可以放置在它的伴生对象中声明和调用。

快速入门案例

代码实现:

package com.atguigu.chapter08

object Accompanyobject {

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

println( ScalaPerson.sex) //true 在底层等价于 ScalaPerson$ . MODULE$. sex()

ScalaPerson. sayHi()//在底层等价于 ScalaPerson$ . MODULE$. sayHi()

//说明

//1. 当在同一个文件中,有 class ScalaPerson 和 object ScalaPerson

//2. class ScalaPerson 称为伴生类,将非静态的内容写到该类中

//3. object ScalaPerson 称为伴生对象,将静态的内容写入到该对象(类)

//4. class ScalaPerson 编译后底层生成 ScalaPerson 类 ScalaPerson.class

//5. object ScalaPerson 编译后底层生成 ScalaPerson$.类 ScalaPerson$.class

//6. 对于伴生对象的内容,可以直接通过 ScalaPerson.属性或者方法

//伴生类

class ScalaPerson { //

var name : String =_

}

//伴生对象

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

var sex : Boolean = true

def sayHi(): Unit = {

println("object ScalaPerson sayHI~~" )

}}

然后对代码进行了源码剖析

如图:

image.png

红色箭头为使用伴生对象方法时里面的 MODULE$是怎么去调用的,其实就是走的 sayHi 方法。

 

三、伴生对象的小结(总结了9点)

1Scala 中伴生对象采用 object 关键字声明,伴生对象中声明的全是“静态"内容,可以通过伴生对象名称直接调用。

2伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名致。

3伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问

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

5从技术角度来讲,scala 还是没有生成静态的内容,只不过是将伴生对象生成了一个新的类,实现属性和方法的调用。[反编译看源码]

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

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

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

9当一个文件中,存在伴生类和伴生对象时,文件的图标会发生变化,图标会变化为一半蓝色一半黄色。

 

四、最佳实践-使用伴生对象完成小孩玩游戏

代码实现:

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)

}}

以上就是伴生对象和伴生类的小结。

相关文章
|
存储 SQL 安全
MySQL 安全加固配置(等保二级)
数据库安全是等保测评和网络安全中的重要的一项内容,本文介绍一些常见的加固配置。
5044 0
|
存储 机器学习/深度学习 算法
位图秘境:解析位图表示法及其在文件系统中的应用(二)
位图秘境:解析位图表示法及其在文件系统中的应用
320 0
|
10月前
|
存储 SQL 安全
大数据的隐私与安全:你的一举一动,都在“裸奔”?
大数据的隐私与安全:你的一举一动,都在“裸奔”?
269 15
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
消息中间件 架构师 Java
阿里面试:秒杀的分布式事务, 是如何设计的?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试阿里、滴滴、极兔等一线互联网企业时,遇到了许多关于分布式事务的重要面试题。为了帮助大家更好地应对这些面试题,尼恩进行了系统化的梳理,详细介绍了Seata和RocketMQ事务消息的结合,以及如何实现强弱结合型事务。文章还提供了分布式事务的标准面试答案,并推荐了《尼恩Java面试宝典PDF》等资源,帮助大家在面试中脱颖而出。
|
网络协议 NoSQL Anolis
开局一张图,debug全靠瞪|内核问题定位与静态分析实战
本文描述了一个在AnolisOS 8.8操作系统上遇到的内核崩溃问题的调试过程。
321 10
|
机器学习/深度学习 人工智能 自然语言处理
混淆矩阵(Confusion Matrix)
随着机器学习和人工智能的迅速发展,分类模型成为了解决各种问题的重要工具。然而,仅仅知道模型预测对了多少样本是不够的。我们需要一种更详细、更系统的方法来理解模型的分类能力,以及它在不同类别上的表现。 混淆矩阵是在机器学习和统计学中用于评估分类模型性能的一种表格。它对模型的分类结果进行了详细的总结,特别是针对二元分类问题,另外混淆矩阵是用于评估分类模型性能的一种表格,特别适用于监督学习中的分类问题。它以矩阵形式展示了模型对样本进行分类的情况,将模型的预测结果与实际标签进行对比。
1479 1
|
存储 easyexcel Java
比 poi导入导出更好用的 EasyExcel使用小结
比 poi导入导出更好用的 EasyExcel使用小结
294 0
|
存储 SQL 缓存
Ctfshow web入门 PHP特性篇 web89-web151 全(一)
Ctfshow web入门 PHP特性篇 web89-web151 全(一)
992 0
|
前端开发
Bootstrap 5 保姆级教程(七):分页 & 列表组
Bootstrap 5 保姆级教程(七):分页 & 列表组