6、scala面向对象-对象

一、对象

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 Person

scala> Person.eyeNum
<console>:12: error: variable eyeNum in object Person cannot be accessed in object Person
       Person.eyeNum
              ^

scala> Person.getEyeNum
this is person object!
res1: Int = 2

scala> 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 Person
defined object Person

scala> val p = new Person("leo", 30)
p: Person = Person@21588809

scala> p.sayHello
Hi, 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 Hello
defined object HelloImpl

scala> 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 Person
defined object Person

scala> val p1 = new Person("leo")
p1: Person = Person@6bf08014

scala> p1.name
res2: String = leo


scala> val p2 = Person("leo")
p2: Person = Person@2c07545f

scala> p2.name
res3: String = leo


5、main方法

在Scala中,main方法作为应用程序的入口,Scala中的main方法定义为def main(args:Array[String]),而且必须定义在object中。


###
[root@saltstack scala]# vim HelloWord.scala
object HelloWord {
  def main(args: Array[String]) {
    println("Hello Word!")
  }
}


[root@saltstack scala]# scalac HelloWord.scala 

[root@saltstack scala]# ls
HelloWord.class  HelloWord$.class  HelloWord.scala

[root@saltstack scala]# scala HelloWord
Hello 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 HelloWord
Hello Word!

[root@saltstack scala]# scala HelloWord leo
Hello, 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 Season

scala> Season.SPRING
res4: 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 Season

scala> Season.SPRING.id
res5: Int = 0

scala> Season.SPRING.toString
res6: String = spring

scala> Season(0)
res7: Season.Value = spring

scala> Season(1)
res8: Season.Value = summer

scala> Season.withName("winter")
res9: Season.Value = winter

scala> for (ele <- Season.values) println(ele)  ##遍历
spring
summer
autumn
winter

原文地址:https://www.cnblogs.com/weiyiming007/p/11009227.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 TwemojiTwemoji是Twitter开源的其完整的Emoji表情图片。开发者可以去GitHub下载完整的表情库,并把这些表情加入到自己的应用或网页中。使用示例:var i = 0;twemoji.parse(  ’emoji, m\u276
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即两个对象在内存中的首地址;equals比较字符串中所包含的内容是否相同。publicstaticvoidmain(String[]args){​ Strings1="abc"; Strings2=newString("abc");​ System.out.println(s1==s2)
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么使用”吧!语法scala...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相信很多人在Scala是一种什么语言问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相信很多人在Scala Trait怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日常操作中,相信很多人在Scala类型检查与模式匹配怎么使用问题上存在疑惑,小编查阅了各式资料,整理...
这篇文章主要介绍“scala中常用但不常见的符号有哪些”,在日常操作中,相信很多人在scala中常用但不常见的符号有哪些问题上存在疑惑,小编查阅了各式资料,整理...
本篇内容主要讲解“Scala基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala基础知识有哪些”...
本篇内容介绍了“scala基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容介绍了“Scala下划线怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容主要讲解“Scala提取器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala提取器怎么使用”...
这篇文章主要讲解了“Scala基础语法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala基础语法有...
本篇内容主要讲解“Scala方法与函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala方法与函数怎...
这篇文章主要讲解了“scala条件控制与循环怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala条...
这篇文章主要介绍“scala函数怎么定义和调用”,在日常操作中,相信很多人在scala函数怎么定义和调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操
这篇文章主要介绍“scala如何声明变量”,在日常操作中,相信很多人在scala如何声明变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
这篇文章主要讲解了“scala的Map和Tuple怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala的Ma...
这篇文章主要介绍“scala的隐式参数有什么作用”,在日常操作中,相信很多人在scala的隐式参数有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
本篇内容主要讲解“Scala怎么进行文件写操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么进行文件...
这篇文章主要讲解了“Scala怎么声明数组”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala怎么声明数组...