前言:
Spark—新一代内存级大数据计算框架,是大数据的重要内容。
Spark就是使用Scala编写的。因此为了更好的学习Spark, 需要掌握Scala这门语言。
在对Scala进行学习时,要经常与Java进行对比。
在Scala的学习之中,我们经常会用到单例对象,或者伴生对象的概念,很多时候只是使用,并未对它们进行更进一步的了解,我结合所学聊一下。
概念:
①单例对象:
为了达到完全面对对象,因此没有静态操作;但是为了能够与java进行交互,就产生了特殊的对象来模拟类对象,即单例对象;全局只有一个。
②伴生对象:
若单例对象与类名一致,则称该单例对象为这个类的伴生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。
举例说明:
object food {
def getFood(){
println("this is not the same")
}
}
class food{
def getFood(): Unit ={
println("this is your food.")
}
}
上边,对象object food为类class food的伴生对象,它自己本身称为单例对象;
类class food为对象 object food的伴生类。
什么叫完全面对对象?
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。
因此,在Java语言中,引入了static关键字,它修饰的称为静态内容,包括属性,方法,代码块等,被static修饰的成员具备以下特点:
随着类的加载而加载
优先于对象存在
修饰的成员,被所有对象所共享
访问权限允许时,可不创建对象,直接被类调用
这样的话,就会出现类可以调用属性或者方法的现象,而不是只有对象才可以调用,这样的面向对象不够纯粹;因此,Scala为了达到完全面向对象,引入了单例对象的概念。
表现:
①我们用Scala写一个Helloword程序来说明,程序如下:
②然后运行,在target目录下,找到文件----右键----Open in Explorer,出现以下两个class文件
③采用 Java 反编译工具 jd-gui.exe 反编译代码,首先反编译Helloword.class文件,如下
这是一个入口类,相当于伴生类,即它为源代码中object Helloworld对象的伴生类。
final关键字表示此类不能被继承
④对Helloword$.class进行反编译
这个是伴生对象的所属类,在这个类中,构造方法私有化,定义一个静态对象,需要在静态代码块中去new,实现了一个单例模式;此处的MODULE $相当于初始源代码中的object Helloworld。