学习Scala:伴生对象和伴生类之间的关系(一)

伴生类和伴生对象的区别和联系
1.伴生类中主要编写非静态代码,伴生对象中主要编写静态代码,静态代码包括属性和方法.Scala中取消了static关键字,因此静态代码只能写到伴生对象中,伴生对象也是单例对象,多次修改其中的内容,后面的访问者获取到的则是最后一次修改之后的内容, 而不是初始化内容.
2.伴生类中的属性和方法只能通过创建对象的方式来进行访问, 伴生对象中的属性和方法只能通过类名.的方式来访问.不能创建对象.



我们还是以简单的例子来说明:

object Test{
     def main(ages: Array[String]){
          println("hello world")
     }
}

在这里插入图片描述
在这里插入图片描述
我们先通过反编译Test.class文件,反编译结果如下:
在这里插入图片描述
然后再次反编译Test$.class文件:
在这里插入图片描述
这个main方法不是静态的,是一个实例的方法,从反编译的角度来看, 代码体的内容实现的是打印字符串hello world的逻辑.



hello world的实现方式总结:
在这里插入图片描述



在看到大牛的博客上, 有个孤立对象的概念, 把孤立对象和伴生对象都叫做单例对象, 孤立对象指的是只有一个使用object关键字来定义对象。伴生对象是指 有一个使用object关键字定义对象,除此之外还有一个使用class关键字定义的同名类,这个同名类叫做伴生类. 同时使用object关键字修饰的对象也叫做单例对象, 在Scala中没有静态的概念, 所有的东西都是面向对象的, 其实object单例对象只是对静态的一种封装而已,在class文件层面中,object单例对象就是用静态来实现的.

简单的例子来说明:

object Test{
    val  a = "hello"
    def printString = println(a)
}

在这个伴生对象上,定义了一个属性和一个方法,在编译完成之后, 会看到有两个class文件. 也就是说 被编译成一个同名类Test, 除此之外,还有一个叫做Test$ 的类, 这个以$结尾的类就是所谓的虚构类,

下面来反编译Test.class。
在这里插入图片描述
由反编译的结果可以看出,源码中属性a对应一个静态的同名a(),源码中的方法printString也对应一个静态的同名方法printString().

下面来反编译Test$.class
在这里插入图片描述

在这里插入图片描述





下面来看一下Scala是如何实现对单例对象的调用的.首先写一个Scala的入口类:

object Main{
   def main(args: Array[String]){
       Test.printString
   }
}
object Test{
    val  a = "hello"
    def printString = println(a)
}

在这里插入图片描述

在这里插入图片描述
反编译Main.class
在这里插入图片描述

由此可见, 在Main$中的成员方法main中,直接调用了Test$.MODULE$.printString()方法, 而绕过了Test类,这也是合理的, 因为只有Test$才处理相关逻辑.

在这里插入图片描述

单例对象的调用方式如下图所示:

在这里插入图片描述



相关内容可以看以下文章
https://blog.csdn.net/u012443641/article/details/89921243
https://blog.csdn.net/zhangjg_blog/article/details/22760957
https://blog.csdn.net/zhangjg_blog/article/details/23376465
https://blog.csdn.net/zhangjg_blog/article/details/23462695
https://blog.csdn.net/zhangjg_blog/article/details/22821047
https://blog.csdn.net/zhangjg_blog/article/details/22903473

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值