开发者学堂课程【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~~" )
}
}
然后对代码进行了源码剖析
如图:
红色箭头为使用伴生对象方法时里面的 MODULE$是怎么去调用的,其实就是走的 sayHi 方法。
三、伴生对象的小结(总结了9点)
1、Scala 中伴生对象采用 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 =
c
Name
/
/
定义变量为name,赋值为c
N
ame
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)
}}
以上就是伴生对象和伴生类的小结。