本文共 3207 字,大约阅读时间需要 10 分钟。
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$.classclass ScalaPerson{ var name:String=_}object ScalaPerson{ val sex:Boolean=true def sayHi: Unit ={ println("object ScalaPerson sayHi") }}
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在实际生产中使用的特别多,虽然简单,但是很重要。
总结:1)类名()==>调用的是伴生对象中的aplly方法 常用2)对象()==>调用的是伴生类中的apply方法 不常用3)类名()看似不用new对象了,但是其实底层一定是通过apply方法创建了一个对象并返回。我们可以利用本文的知识完成下面的问题~练练手~
下面的题,是一道java题,请使用scala完成该题的要求1)在 Frock类中声明私有的静态属性 currentNum,初始值为100000,作为衣服出厂的序列号起始值。2)声明公有的静态方法 getNextNum,作为生成上衣唯一序列号的方法。每调用一次,将 currentNum增加100,并作为返回值3)在 TestFrock类的main方法中,分两次调用 getNextNum方法,获取序列号并打印输出4)在Frock类中声明 serialNumber(序列号)属性,并提供对应的get方法;5)在Frock类的构造器中,通过调用 getNextNum方法为Frock对象获取唯一序列号,赋给 serialNumbe属性。6)在 TestFrock类的main方法中,分别创建三个 Frock对象,并打印三个对象的序列号,验证是否按100递增
代码仅供参考~如有更好的建议请联系企鹅:1176738641
object TestFrock { def main(args: Array[String]): Unit = { val frockList=List(Frock(),Frock(),Frock()) for (frock<-frockList){ println(frock.getSerialNumber()) } }}class Frock(){ private [this] var serialNumber:Int= _ def getSerialNumber():Int={ this.serialNumber } def setSerialNumber(num:Int): Unit ={ this.serialNumber=num }}object Frock{ private var currentNum=100000 def apply(): Frock = { val frock=new Frock() frock.setSerialNumber(getNextNum()) frock } def getNextNum() :Int={ currentNum=currentNum+100 currentNum }}
转载于:https://blog.51cto.com/14309075/2393082