伴生对象的快速入门|学习笔记

简介: 快速学习伴生对象的快速入门。

开发者学堂课程【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 Scalaperson {//伴生类

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。

相关文章
|
5月前
|
存储 C++
C++从入门到精通:2.1.1函数和类
C++从入门到精通:2.1.1函数和类
|
5月前
|
Java
Java反射课程教程
Java反射课程教程
34 0
Scala快速入门-6-单例对象及伴生对象
• 用对象作为单例或存放工具方法,Scala没有静态方法或字段 • 类可以有一个同名的伴生对象 • 对象的apply方法通常用来构造伴生类的新实例 • Scala的main函数定义 单例对象
|
Java Scala
Scala快速入门-5-类定义
每个类都有一个主构造器,这个构造器和类的定义“交织”在一起,它的参数直接成为类的字段,主构造器执行类体中所有的语句 类中的字段自动带getter和setter方法 用@BeanProperty注解生成JavaBean的getXxx/setXxx方法 辅助构造器是可选的,它们都叫做this
|
Java Scala 开发者
伴生对象使用细节和最佳实践|学习笔记
快速学习伴生对象使用细节和最佳实践。
107 0
伴生对象使用细节和最佳实践|学习笔记
|
Java Scala 开发者
Scala 的继承快速入门|学习笔记
快速学习 Scala 的继承快速入门。
Scala 的继承快速入门|学习笔记
|
网络协议 编译器 测试技术
反射的快速入门(2)|学习笔记
快速学习反射的快速入门(2)
反射的快速入门(2)|学习笔记
|
网络协议 测试技术 Go
反射的快速入门(1)|学习笔记
快速学习反射的快速入门(1)
反射的快速入门(1)|学习笔记
|
开发者
继承的基本使用 | 学习笔记
快速学习继承的基本使用,介绍了继承的基本使用系统机制, 以及在实际应用过程中如何使用。
104 0
继承的基本使用 | 学习笔记