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

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

开发者学堂课程【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)

}}

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

相关文章
|
9天前
|
Java 编译器 数据处理
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
7 0
|
1月前
|
Java
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
45 0
|
10月前
|
Java
Java 类(私有属性、对象方法、类方法,构造函数)
Java 类(私有属性、对象方法、类方法,构造函数)
86 0
|
Java
Java面向对象基础3——构造方法及this关键字
Java面向对象基础3——构造方法及this关键字
123 0
Java面向对象基础3——构造方法及this关键字
|
C++
C++类的静态方法
C++类的静态方法
65 0
|
开发者 Python
类方法和静态方法 | 学习笔记
快速学习类方法和静态方法,介绍了类方法和静态方法系统机制, 以及在实际应用过程中如何使用。
87 0
类方法和静态方法 | 学习笔记
|
开发者 Python
类方法和静态方法回顾|学习笔记
快速学习类方法和静态方法回顾
79 0
类方法和静态方法回顾|学习笔记
|
开发者 Python
私有属性的继承特点 | 学习笔记
快速学习 私有属性的继承特点
82 0
|
前端开发 开发者
class-子类访问父类上的实例方法|学习笔记
快速学习 class-子类访问父类上的实例方法
85 0
|
Java
Java中继承的实现及继承中变量、构造方法、成员方法的访问特点
继承的实现及继承中变量、构造方法、成员方法的访问特点的简单示例
98 0
Java中继承的实现及继承中变量、构造方法、成员方法的访问特点

热门文章

最新文章