一、对象

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

6、scala面向对象-对象的更多相关文章

  1. Scala 面向对象(一):类与对象基础(一)

    1 如何定义类 [修饰符] class 类名 { 类体 } 定义类的注意事项 1)scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public), 2)一个Scala ...

  2. Spark 3000门徒第二课scala面向对象总结

    昨晚听了王家林老师3000门徒spark系列课程的第二课,讲述了scala面向对象知识,并且带着过了一遍Spark核心类:SparkContent,RDD的代码,下面写一下心得: RDD是抽象类,实现 ...

  3. 6. Scala面向对象编程(基础部分)

    6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...

  4. scala 面向对象之 继承

    scala 面向对象之 继承 scala   1.extends Scala中,让子类继承父类,与Java一样,也是使用extends关键字 继承就代表,子类可以从父类继承父类的field和metho ...

  5. 创建对象的两种方法: new 和 面向对象(对象字面量)及对象属性访问方法

    创建对象的两种方法: new 和 面向对象(对象字面量)用 new 时:var o = new Object();o.name = "lin3615";alert(o.name); ...

  6. 第163天:js面向对象-对象创建方式总结

    面向对象-对象创建方式总结 1. 创建对象的方式,json方式 推荐使用的场合: 作为函数的参数,临时只用一次的场景.比如设置函数原型对象. var obj = {}; //对象有自己的 属性 和 行 ...

  7. Java面向对象-对象的多态性

    Java面向对象-对象的多态性 Java中的多态性表现: 1,方法的重载和重写(覆盖): 2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现: 我们先搞个父类Animal: ...

  8. JavaScript面向对象—对象的创建和操作

    JavaScript面向对象-对象的创建和操作 前言 虽然说在JavaScript编程语言中,函数是第一公民,但是JavaScript不仅支持函数式编程,也支持面向对象编程.JavaScript对象设 ...

  9. Scala面向对象编程与类型系统

    Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性. 类定义 scala使用class关键字定义类: class MyComplex(real0:Double, im ...

随机推荐

  1. 升级webapi依赖的Newtonsoft.json的版本(转)

    随着微软日渐重视开源社区的贡献,微软在自己的产品中往往也会集成开源的第三方库. 比如System.Net.Http.Foramatting.dll 就依赖于Newtonsoft.json v4.5. ...

  2. pjax + tp5,实现局部无刷新返回数据

    文件1:\application\admin\controller\Setting.php 最后一句代码:要fetch原页面 <?php namespace app\admin\controll ...

  3. SVM怎样解决多分类问题

    从 SVM的那几张图能够看出来,SVM是一种典型的两类分类器.即它仅仅回答属于正类还是负类的问题.而现实中要解决的问题,往往是多类的问题(少部分例外,比如垃圾邮件过滤,就仅仅须要确定"是&q ...

  4. 为什么说Python是一门动态语言--Python的魅力

    动态语言的定义:动态编程语言是高级程序设计语言的一个类别.在计算机科学领域已被广泛应用.它是一类在执行时能够改变其结构的语言:比如新的函数.对象.甚至代码能够被引进.已有的函数能够被删除或是其它结构上 ...

  5. 宿舍更换的新淋浴喷头"水温vs旋钮角度"关系的研究(曲线)

    版权声明:我极少创造新知识,大部分情况下是个知识的二道贩子 https://blog.csdn.net/stereohomology/article/details/24478825 应该非常一目了然 ...

  6. FI 常用表

    FI 常用表 GL部分:FAGLFLEXT(FMGLFLEXT)   总账汇总表 GLT0        旧总帐汇总表           SKA1        总账科目主记录 (科目表)      ...

  7. GIT笔记:将项目发布到码云

    GIT笔记:将项目发布到码云 发布步骤 1.码云创建项目 记录下项目的远程地址: https://gitee.com/mrsaber/ms_supplyAndSale.git 2.在本地创建GIT仓库 ...

  8. 【Leetcode-easy】String to Integer(atoi)

    题目要求:字符串->整型 * 1. 首先需要丢弃字符串前面的空格. * 2. 然后可能有正负号(注意只取一个,如果有多个正负号,那么说这个字符串是无法转换的,返回0.比如测试用例里就有个“+-2 ...

  9. 算法(Algorithms)第4版 练习 1.3.10

    主要思路:和1.3.9相似,只不过运算表达式的生成方式不一样 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数 ...

  10. 截取带HTML标签的文本并保留文本样式

    一个截取HTML文本的工具,可以按照文字字数或文字字节长度进行截取,保留HTML样式并在最后自动补齐截取后的标签.按工作要求编写,时间紧迫,代码未优化,欢迎讨论和指正.​1. [文件] SubHtml ...