开发者学堂课程【Scala 核心编程-基础:伴生对象的快速入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8984
伴生对象的快速入门
目录
一、伴生对象的快速入门案例
二、伴生对象关系图
一、伴生对象的快速入门案例
例:新建一个类 AccompanyObject,选择 object
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 属性或者方法。
//伴生类
class scalaperson {
var name :String=_
}
//伴生对象
object ScalaPerson{
var sex:Boonlean = true
def sayHi():Unit = {
println(
“
object ScalaPerson sayHi
”
)
}
}
运行完后发现它返回 true。打开反编译工具,可以看到 ScalaPerson.class 对应伴生类,ScalaPerson$.class 对应伴生对象。ScalaPerson.class 点开可以看到name是放进去的,里面还提供了一系列静态方法。ScalaPerson$.class 里静态的 sex,sayHi 方法也是静态的内容,全部放在 public void sayHi 里。
ScalaPerson.class 是非静态的,为什么里面有 sayHi?因为它看起来是静态的,其实根本没有新东西,这个方法只是一个壳。要写的静态东西实际上是放在 ScalaPerson$.class 里。
二、伴生对象关系图
class
S
calaperson {//伴生类
var name :String=_
}
object ScalaPerson{//伴生对象
var sex:Boonlean = true
def sayHi():Unit = {
println(
“
object ScalaPerson sayHi
”
)
}
}
关系为对应的伴生类是:
public class ScalaPerson
{
private String name;
public static void sayHi()
{
ScalaPerson.,MODULEs sayHi();
}
public static void sex_$eq(boolean paramBoolean)
{
对应伴生对象的是:
public final class ScalaPerson$
{
public static final MODULE$;//就是ScalaPerson实例
private boolean sex;
Static
{
new ();
{
Public boolean sex()
{
return this,sex; }
Public void sex_$eq(boolean x$1) ( this.sex =x$1; }
publicvoid sayHi() {
Predef..MODULE$.println("object ScalaPerson sayHi");
}
private ScalaPerson${}{
MODULE$ = this;
this.sex =t1ue;
1、两者之间的关系是怎么形成的?
public static voidsayHi 里面有静态,想去调用伴生类里面的方法,其实是用了 Scalaperson...MODULE$ 。在ScalaPerson$里面有一个 final 类型的 MODULE$,也是一个静态 。这个东西在下面 new 出来了。换言之MODULE$就是 ScalaPerson$的一个实例,而且是静态性质。
2、调用哪个?
//使用伴生对象的属性或方法
object AccompanyObject{
def main(args: Array[String]):Unit = {
println(ScalaPerson.sex) //true在底层等价于ScalaPerson$.MODULE$.sex()
ScalaPerson.sayHi()//在底层等价于ScalaPerson$.MODULE$.sayHi()
}
以 ScalaPerson.sayHi()为例,打开反编译工具进入 AccompanyObject$.class。ScalaPerson.sayHi()在AccompanyObject$.class里调用的是 ScalaPerson.MODULE$.sex()。底层是 ScalaPerson...MODULE$.sayHi(),从代码来看并没有用到 ScalaPerson,去调用伴生对象的方法目前没有和 ScalaPerson 发生关系,它是直接调用 sayHi。