Scala编程之伴生对象

伴生对象是scala中静态的概念

Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在 Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,我们称之为类的伴生对象。这个类的所有静态内容都可以放置在它的伴生对象中声明和调用。

伴生对象的使用

下面我们通过一个小案例,对伴生对象和伴生类的特点进行探讨

//首先我们创建伴生类class ScalaPerson和伴生对象 object ScalaPerson,然后在里面设置几个方法和属性
object AccompanyObject {

  def main(args: Array[String]): Unit = {

    println(ScalaPerson.sex) //true   底层等价于ScalaPerson$.MODULE$.sex
    ScalaPerson.sayHi  //object ScalaPerson sayHi  底层等价  ScalaPerson$.MODULE$.sayHi()
  }
}
//说明:
//当在一个文件之后有class ScalaPerson 和object ScalaPerson
//class ScalaPerson被称为object ScalaPerson的伴生类,我们常常把非静态内容写进该类中
//object ScalaPerson被称为class ScalaPerson的伴生对象,将静态内容写入该对象中
//class ScalaPerson在底层被编译为class ScalaPerson.class
//object ScalaPerson在底层被编译为class ScalaPerson$.class
class ScalaPerson{
  var name:String=_
}
object ScalaPerson{
  val sex:Boolean=true
  def sayHi: Unit ={
    println("object ScalaPerson sayHi")
  }
}

反编译看源码

小结

  1. Scala中伴生对象采用 object关键字声明,伴生对象中声明的全是"静态"内容,可以通过伴生对象名称直接调用。
  2. 伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致
  3. 伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问
  4. 从语法角度来讲,所谓的伴生对象其实就是类的静态方法和成员的集合
  5. 从技术角度来讲, scala还是没有生成静态的内容,只不过是将伴生对象生成了一个新的类,实现属性和方法的调用。[反编译看源码]
  6. 从底层原理看,伴生对象实现静态特性是依赖于 public static final MODULE$实现的
  7. 伴生对象的声明应该和伴生类的声明在同一个源码文件中(如果不在同一个文件中会运行错误!),但是如果没有伴生类,也就没有所谓的伴生对象了,所以放在哪里就无所谓了。
  8. 如果 class A独立存在,那么A就是一个类,如果 object A独立存在,那么A就是一个"静态性质的对象[即类对象],在 object A中声明的属性和方法可以通过A.属性和A.方法来实现调用
  9. 当一个文件中,存在伴生类和伴生对象且不存在其他类时,文件的图标会发生变化

    apply方法

    apply方法是非常常用的,它主要的作用就是简化创建对象的写法

    //创建一个List集合
    val list=List(("A",0),("A",2),("B",1),("B",2),("C",1))

    我们创建list的时候,并没有new 创建对象,也没有通过反射创建对象,那么为什么直接List()就可以创建一个list集合呢?答案就在List()底层实现了apply()方法
    我们可以Ctrl +鼠标左键点击List
    可以看到,底层实现了apply方法
    我们现在来实际使用一下apply方法吧

object ApplyDemo extends App {

  //使用apply方法创建对象
  val pig1=Pig("佩奇") // 自动触发apply(pname: String)
  val pig2=Pig()     //自动触发apply()

  printf("小猪1为%s \n",pig1.name)//小猪1为佩奇
  printf("小猪2为%s \n",pig2.name)//小猪2为匿名Pig

}

class Pig(pname:String){
  var name=pname
}

object Pig{
  def apply(pname: String): Pig = new Pig(pname)   //自动生成
  def apply():Pig=new Pig("匿名Pig")    //重载方法

}

apply在实际生产中使用的特别多,虽然简单,但是很重要。

我们可以利用本文的知识完成下面的问题~练练手~

下面的题,是一道java题,请使用scala完成该题的要求
1)在 Frock类中声明私有的静态属性 currentNum,初始值为100000,作为衣服出厂的序列号起始值。
2)声明公有的静态方法 getNextNum,作为生成上衣唯一序列号的方法。每调用一次,将 currentNum增加100,并作为返回值
3)在 TestFrock类的main方法中,分两次调用 getNextNum方法,获取序列号并打印输出
4)在Frock类中声明 serialNumber(序列号)属性,并提供对应的get方法;
5)在Frock类的构造器中,通过调用 getNextNum方法为Frok对象获取唯一序列号,赋给 serialNumbe属性。
6)在 Test Frock类的main方法中,分别创建三个 Frock对象,并打印三个对象的序列号,验证是否按100递增

原文地址:https://blog.51cto.com/14309075/2393082

时间: 2024-10-02 18:03:35

Scala编程之伴生对象的相关文章

Scala学习笔记-伴生对象于孤立对象

Scala-伴生对象于孤立对象 Scala虽然是基于JVM构建的,但与Java还是有很多区别,其实一个重要的区别是Scala比Java更面向对象(纯面向对象),最明显的用例是scala中所有的操作符都是方法(操作符面向的使用者是对象). 伴生对象/孤立对象也是scala作为纯面向对象语言的一种体现. 孤立对象 先看一个例子 object Test{ var a = "helloworld" def helloworld(): Unit = { println("hellowo

scala中的伴生对象实现原理

孤立对象是只有一个object关键字修饰的对象. 该对象会编译成两个class文件, 一个是以孤立对象的名字命名的class,  一个是以孤立对象的名字后面加上一个$字符命名的class, 这个class又叫做虚构类. 源码中的孤立对象中的字段和方法, 都被编译成以孤立对象的名字命名的class中的静态方法, 这些静态方法都会访问单例的虚构类对象. 虚构了是传统意义上的单例模式, 并且在类初始化的时候有, 就会创建唯一的对象. 源码中的所有字段和方法都会在虚构类中有相对应的成员. 如果不明白的可

好程序员大数据学习路线分享scala单列和伴生对象

scala单例 object SingletonDemo { ??def main(args: Array[String]): Unit = { ????val s = SessionFactory ????println(s.getSession) ????println(s.getSession.size) ?//.size得到几个session对象 ??} } object SessionFactory{ ??println("SessionFactory 被执行了") ?? ?

scala成长之路(4)compaion object——伴生对象的使用

虽然java一直声称自己是完全面向对象的语言,但一直以来都被很多人所质疑,其中java的静态成员函数就是主要的"罪魁祸首".由于java中保留了静态方法的调用,导致其编程模式依然有过程式编程的可能,尤其是在静态方法被滥用的当下(一个顽固的面向过程程序员完全可以将他的过程思维用一大推静态方法实现,而class仅仅只是个空有其表的外壳而已) 所以在scala中,设计者摒弃了static关键字,宣称自己是完全面向对象的,似乎更有说服力... 但是我们在编程中有时确实需要用到一般功能性函数,例

快学Scala 第九课 (伴生对象和枚举)

Scala没有静态方法和静态字段, 你可以用object这个语法结构来达到同样的目的. 对象的构造器只有在第一次被使用时才调用. 伴生对象apply方法: 类和它的伴生对象可以互相访问私有特性,他们必须存在于同一个源文件. 类中要访问类的伴生对象中成员,需要通过类.成员调用. class Account private (val id: Int, initialBalance: Double){ } object Account { def apply(initialBalance: Doubl

scala学习手记15 - 独立对象和伴生对象

上一节中的单例对象MarkerFactory 就是一个独立对象的例子.尽管它管理着Marker类,但是它并没有关联到任何类上. scala也可以创建关联到类上的对象.这样的对象同类共享同一个名字,这样的对象称为伴生对象,对应的类就称为伴生类.在scala里,类和伴生对象没有界限,它们互相可以访问彼此的private 方法和private 属性.下面使用伴生对象重写了Marker: class Marker private(val color: String) { println("Creatin

【Scala】单例对象与伴生对象

Scala的单例对象 Scala不能定义静态成员,而是代之定义单例对象(singleton object).以object关键字定义. 对象定义了某个类的单个实例,包含了你想要的特性: object Accounts{ private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber} } 当你在应用程序中需要一个新的唯一账号时,调用Account.newUniqueNumber()即可. 对象的构造

每天学一点Scala之 伴生类和伴生对象

1.  object 相当于class的单个实例,因此,在object里声明的变量都是静态变量,静态方法 2.  在object里声明的变量,都是全局变量,也就是类的公共属性,或者类似于java中父类的属性 3.  object里的构造器,也就是object 内部不在method中的代码,都属于构造器的内容 4. 同样,object的主构造器只会在第一次调用时执行,多次调用,只会执行一次. object使用场景 1.  单例模式 2.  工具类 伴生对象与 伴生类? 如果有一个class,还有一

Scala 伴生对象

转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://www.blogbus.com/dreamhead-logs/60217908.html 准备涉水Scala的Java程序员请注意,Scala里没有static. 在大多数情况下,static真不该是static的.像Scala这样想在面向对象上更进一步的程序设计语言,取消static是一种进取的表现,这样得以保证了其面向对象模型的完整性.好吧,我承认,??有时候,我们还是需要类一级的属性和操作的.在Scala里,我们还是有机