Scala——六、对象

本章要点:

  • 用对象作为单例或存放工具方法
  • 类可以拥有一个同名的伴生对象
  • 对象可以扩展类和特质
  • 对象的apply方法通常用来构造伴生类的新实例
  • 如果不想显式定义main方法,可以扩展App特质的对象
  • 可以通过扩展Enumeration对象来实现枚举

1.单例对象

Scala没有静态方法或静态字段,用object语法结果来达到同样的目的。

object Accounts{
    
    
	private var lastNumber = 0
	def newUniqueNumber() = {
    
    lastNumber += 1;lastName}
}

对象的构造器在该对象第一次被使用时调用。在本例中,Account.newUniqueNumber()的首次调用时执行。如果一个对象从未被使用,那么其构造器也不会被执行。
对象本质上可以拥有类的所有特性,但是不能为他提供构造参数。

2.伴生对象

在C++或者Java中,会用到既有实例方法又有静态方法的类。在Scala中,可以通过类与类同名的伴生对象来达到相同的目的。

class Account{
    
    
	val id = Account.newUniqueNumber()
}

object Account{
    
    
	private var lastNumber = 0
	private def newUniqueNumber() = {
    
    }
}

类和它的伴生对象可以相互访问私有性质,他们必须存在于同一个源文件中类的伴生对象的功能特性并不在类的作用域内。所以看上面的代码可以发现,class中调用newUniqueNumber带了Account.的前缀。

3.扩展类或特质的对象

一个object可以扩展类以及一个或者多个特质,其结果是一个扩展了定义类以及特质的类的对象,同时拥有在对象定义中给出的所有特性。

4.apply方法

我们通常会定义和使用对象的apply方法。当遇到如下形式的表达式时,apply方法就会被调用:Object(参数1,参数2,……,参数N),其返回的是伴生类的对象

Array("Marry","had","a","little","lamb")//不需要构造器就可以创建Array

注意:Array(100)和new Array(100)是有区别的,前者表示有一个元素为100的数组,而后者是申请一个空间为100的数组,是100个null。

5.应用程序对象

每一个Scala程序都是从一个对象的main方法开始,这个方法的类型为

Array[String]=>Unit:
	object Hello{
    
    
		def main(args:Array[String]){
    
    
			println("Hello,World!")
		}
	}

除了每次提供自己的main方法以外,还可以扩展App特质,将程序代码放入构造器方法体类,如果要获取命令行参数,则可以通过args属性。

6.枚举

Scala没有枚举类型。标准类库提供了一个Enumeration助手类,可以用来产出枚举。
定义一个扩展Enumeration类的对象并以Value方法调用初始化枚举中的所有可选值。

object TrafficLight Color extend Enumeration{
    
    
	val Red,Yellow,Green = Value
}

然后我们可以通过Value调用将他们初始化

val Red = Value
val Yellow = Value
val Green = Value

还可以向Value方法传入ID,名称,或者两个参数都传:

val Red = Value(0,"stop")
val Yellow = Value(10)
val Green = Value("Go")

猜你喜欢

转载自blog.csdn.net/Cxf2018/article/details/109509885