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

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

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

相关文章
|
6天前
|
Java 开发者 Kotlin
Kotlin教程笔记(2) - 类与构造器
Kotlin教程笔记(2) - 类与构造器
23 6
|
9天前
|
Java 开发者 Kotlin
Kotlin教程笔记(2)- 类与构造器
本系列教程详细讲解Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,可查看“简洁”系列教程。本文重点介绍Kotlin中的类与构造器,包括类的基本概念、主构造器与次构造器的使用、构造器参数的声明、类的继承以及包的声明等内容。通过实例代码,帮助读者更好地理解和掌握Kotlin的类与构造器相关知识。
19 1
|
21天前
|
Java 开发者 Kotlin
​ Kotlin教程笔记(14) - 伴生对象与静态成员
​ Kotlin教程笔记(14) - 伴生对象与静态成员
39 3
|
6月前
|
存储 数据安全/隐私保护 C++
C++零基础教程(C++的类2)
C++零基础教程(C++的类2)
52 0
|
6月前
|
编译器 C++
C++零基础教程(C++中的类1)
C++零基础教程(C++中的类1)
64 0
|
6月前
|
存储 数据安全/隐私保护 C++
C++零基础教程(C++中的类)
C++零基础教程(C++中的类)
42 0
|
6月前
|
Java
Java反射课程教程
Java反射课程教程
36 0
|
Java Scala 开发者
伴生对象使用细节和最佳实践|学习笔记
快速学习伴生对象使用细节和最佳实践。
112 0
伴生对象使用细节和最佳实践|学习笔记
|
存储 PHP 开发者
类内部对象|学习笔记
快速学习类内部对象
类内部对象|学习笔记
下一篇
无影云桌面