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

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

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

相关文章
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
c语言学习
浙江大学C语言设计笔记
c语言学习
|
4天前
|
数据采集 人工智能 安全
|
14天前
|
云安全 监控 安全
|
5天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1139 152
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1802 9
|
10天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
728 152
|
7天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
507 5