博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6、scala面向对象-对象
阅读量:4590 次
发布时间:2019-06-09

本文共 4409 字,大约阅读时间需要 14 分钟。

一、对象

1、object

object,相当于class的单个实例,通常在里面放一些静态的field或者method,第一次调用object的方法时,就会执行object的constructor,也就是object内部不在method中的代码,但是object不能定义接受参数的constructor。object的constructor只会在其第一次被调用时执行一次,以后再次调用就不会再次执行constructor了。object通常用于作为单例模式的实现,或者放class的静态成员,比如工具方法。###scala> :paste// Entering paste mode (ctrl-D to finish)object Person {  private var eyeNum = 2  println("this is person object!")  def getEyeNum = eyeNum}// Exiting paste mode, now interpreting.defined object Personscala> Person.eyeNum
:12: error: variable eyeNum in object Person cannot be accessed in object Person Person.eyeNum ^scala> Person.getEyeNumthis is person object!res1: Int = 2scala> Person.getEyeNum #object里的代码只会执行一次,再次调用就不会执行了res2: Int = 2

2、伴生对象

如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类。伴生类和伴生对象必须存放在一个.scala文件之中,伴生类和伴生对象,最大的特点在于,互相可以访问private field。###scala> :paste// Entering paste mode (ctrl-D to finish)class Person(val name: String, val age: Int) {  def sayHello = println("Hi, " + name + ", I know you are " + age + "years old" + ", and usually you must have " + Person.eyeNum + " eyes.")}object Person {  private val eyeNum = 2  def getEyeNum = eyeNum}// Exiting paste mode, now interpreting.defined class Persondefined object Personscala> val p = new Person("leo", 30)p: Person = Person@21588809scala> p.sayHelloHi, leo, I know you are 30years old, and usually you must have 2 eyes.

3、object继承抽象类

object的功能和class类似,除了不能定义接收参数的constructor之外,object也可以继承抽象类,并覆盖抽象类中的方法。###scala> :paste// Entering paste mode (ctrl-D to finish)abstract class Hello(var message: String) {  def sayHello(name: String): Unit}object HelloImpl extends Hello("hello") {  override def sayHello(name: String) = {  println(message + "," + name)  }}// Exiting paste mode, now interpreting.defined class Hellodefined object HelloImplscala> HelloImpl.sayHello("leo")hello,leo

4、apply方法

object中重要的一个特殊方法,apply方法,通常在伴生对象中实现apply方法,并在其中实现构造伴生类的对象的功能。而创建伴生类的对象时,通常不会使用new Class的方式,而是使用Class()的方式,隐式调用伴生对象的apply方法,让对象创建更简洁。如Array类的伴生对象的apply方法就实现了接收可变数量的参数,并创建一个Array对象的功能。scala> val a = Array(1,2,3,4,5)a: Array[Int] = Array(1, 2, 3, 4, 5)###scala> :paste// Entering paste mode (ctrl-D to finish)class Person(val name: String)object Person {  def apply(name: String) = new Person(name)}// Exiting paste mode, now interpreting.defined class Persondefined object Personscala> val p1 = new Person("leo")p1: Person = Person@6bf08014scala> p1.nameres2: String = leoscala> val p2 = Person("leo")p2: Person = Person@2c07545fscala> p2.nameres3: String = leo

5、main方法

在Scala中,main方法作为应用程序的入口,Scala中的main方法定义为def main(args:Array[String]),而且必须定义在object中。###[root@saltstack scala]# vim HelloWord.scalaobject HelloWord {  def main(args: Array[String]) {    println("Hello Word!")  }}[root@saltstack scala]# scalac HelloWord.scala [root@saltstack scala]# lsHelloWord.class  HelloWord$.class  HelloWord.scala[root@saltstack scala]# scala HelloWordHello Word!除了自己实现main方法,还可以继承App Train,然后将需要在main方法中运行的代码,直接作为object的constructor代码,而且用args可以接受传入的参数。###[root@saltstack scala]# vim HelloWord.scala object HelloWord extends App {  if (args.length > 0) println("Hello, " + args(0))  else println("Hello Word!")}[root@saltstack scala]# scalac HelloWord.scala [root@saltstack scala]# scala HelloWordHello Word![root@saltstack scala]# scala HelloWord leoHello, leo

6、用object来实现枚举功能

Scala没有直接提供类似于Java的Enum枚举特性,如果要实现枚举,则需要用object继承Enumeration,并且调用Value方法来初始化枚举值。###scala> :paste// Entering paste mode (ctrl-D to finish)object Season extends Enumeration {  val SPRING, SUMMER, AUTUMN, WINTER = Value}// Exiting paste mode, now interpreting.defined object Seasonscala> Season.SPRINGres4: Season.Value = SPRING还可以通过Value传入枚举值的id和name,通过id和toString可以获取,还可以通过id和name来查找枚举值。###scala> :paste// Entering paste mode (ctrl-D to finish)object Season extends Enumeration {  val SPRING = Value(0, "spring")  val SUMMER = Value(1, "summer")  val AUTUMN = Value(2, "autumn")  val WINTER = Value(3, "winter")}// Exiting paste mode, now interpreting.defined object Seasonscala> Season.SPRING.idres5: Int = 0scala> Season.SPRING.toStringres6: String = springscala> Season(0)res7: Season.Value = springscala> Season(1)res8: Season.Value = summerscala> Season.withName("winter")res9: Season.Value = winterscala> for (ele <- Season.values) println(ele)  ##遍历springsummerautumnwinter

转载于:https://www.cnblogs.com/weiyiming007/p/11009227.html

你可能感兴趣的文章
h5移动端适配iOS遇到的问题
查看>>
20. 最长公共子串(ToDo)[LCS]
查看>>
浮动:图解两栏布局
查看>>
CSS3 box-sizing 属性
查看>>
expect用法
查看>>
JavaScript [ 转 ] —— 面向对象编程(二):构造函数的继承
查看>>
$百度应用引擎BAE的使用与应用部署
查看>>
Keras入门——(6)长短期记忆网络LSTM(三)
查看>>
高效算法的常用技术(算法导论)
查看>>
TCP、UDP套接字网络协议
查看>>
STDIN_FILENO与stdin区别(转)
查看>>
页面操作postback后保持滚动条位置
查看>>
nginx动静分离小示例
查看>>
nginx socket转发设置
查看>>
centos samba搭建
查看>>
Android Studio 错误: 非法字符: '\ufeff'
查看>>
并发编程--一堆锁,GIL,同步异步,Event事件
查看>>
svn配置
查看>>
解决SQLite database is locked
查看>>
Javascript中this关键字
查看>>