Scala编程入门---面向对象编程之对象
对象
Object,相当于class单个实例,通常在里面放一些静态的filed或method
第一次调用object方法时候,就会执行object的constructor,也就是Object中不在method中的代码,但是Object不能定义接收参数的constructor
注意,Object的constructor只会在第一次被调用的时执行一次,以后再次调用就不会执行construtctor了
object通常作为单例模式来实现,或者存放静态成员,例如:
object Person{
private var eyeNum =2
prinln("this is person object")
df getEyeNum = eyeNum
} Person.eyeNum #报错
person.getEyeNum #返回 this is person object 和 2
person.getEyeNum #在一次执行这个方法的时候 返回2 Object对象的构造代码只在第一次执行的时候调用 以后不调用
伴生对象
如果有一个class还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类
伴生类和伴生对象必须存放在一个.scala中
伴生类和伴生对象最大的特点就是,互相可以访问private field
Object Person{
private var eyeNum =2
def getEyeNum =eyeNum
} class Person(val name:Stirng,val age:int){
def sayHello = prinln("Hi"+name+"i konw you "+age+"years old and usually you must have"+Person.eyeNum+"eyes")
让Object继承抽象类
object的功能其实和class很类似,除了不能定义接收参数的constructor之外
object也可以继承抽象类,并覆盖抽象类中的方法
abstract class Hello(val message:String){ def sayHello(name:String):Unit } Object HelloImpl extends Hello ("hello"){ override def sayHello(name:String)={ println(message+","+name) }
}
apply方法
object中非常重要的一个特殊方法,就是apply方法
通常伴生对象中事项apply方法,并其中实现构造伴生类的对象功能
而创建伴生类的对象时,通常不会使用new Class的方法,而是使用Class()的方式,隐式的调用伴生对象的apply方法,这样会让对象创建更简洁
val a = array(1,2,3,4,5) class Person(val name:String) object Person(val name:String){
def apply(name:String) =new Person(name)
}
用Object来实现枚举功能
scala没有直接提供类似java中的枚举特性们如果要实现枚举慢则需要用object继承Enumeration类,并且调用Value方法来初始化枚举值
obejc Season extends Enumeration{
val SPRING ,SUMMER,AUTUMN,WINTER = Value
} //还可以通过Value传入枚举值得id和name,通过id和toString可以获取,还可以通过id和name来查找枚举值 object Season extends Enumeration{
val SPRING = Value(0,"spring")
val SUMMER =Value(1,"summer")
val AUTUMN =Value(2,"autumn")
val WINTER = Value(3,"winter")
}
Season(0) #获取spring
Season.withName("spring") #3
//使用枚举Object values可以遍历枚举值
for( ele <- Season.values) println(ele)
Scala编程入门---面向对象编程之对象的更多相关文章
- Scala编程入门---面向对象编程之Trait高级知识
trait调用链 Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可 类中调用多个trait中都有这个 ...
- Scala编程入门---面向对象编程之Trait
Scala中Trait是一种特殊概念 首先我们可以将Triat做为接口来使用,此时的Triat就与java中的接口非常相似 在Triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出具体的 ...
- 8、scala面向对象编程之对象
1. Object 2.伴生对象 3.让object继承抽象类 4.apply方法 5.main方法 6.用object实现枚举功能 1. Object Object,相当于class的单个实例, ...
- Scala 面向对象编程之对象
此对象非彼java bean对象 是scala object的对象 Object // object,相当于class的单个实例,通常在里面放一些静态的field或者method // 第一次调用ob ...
- Scala编程入门---函数式编程
高阶函数 Scala中,由于函数时一等公民,因此可以直接将某个函数传入其他函数,作为参数.这个功能是极其强大的,也是Java这种面向对象的编程语言所不具备的. 接收其他函数作为函数参数的函数,也被称作 ...
- scala学习笔记-面向对象编程之Trait
将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可 ...
- JS面向对象编程之对象
在AJAX兴起以前,很多人写JS可以说都是毫无章法可言的,基本上是想到什么就写什么,就是一个接一个的函数function,遇到重复的还得copy,如果一不小心函数重名了,还真不知道从何开始查找错误,因 ...
- Scala编程入门---函数式编程之集合操作
集合的函数式编程: 实战常用: //map案例实战:为List中的每个元素都添加一个前缀. List("leo","Jen","peter" ...
- Scala编程入门---Map与Tuple
创建Map //创建一个不可变的Map val ages = Map("Leo" -> 30,"Jen" ->25,"Jack" ...
随机推荐
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
一直在寻找一个示例可以将ROS学习中常用的基础内容大部分都包含进去,最好还包括Gazebo仿真, 这样即使没有硬件设备,也可以很好的学习ROS相关内容,但又必须有对应的硬件,便于后续研究. 这里,介绍 ...
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(十五)
在Xcode中打开Robot.h文件添加如下2个方法: -(void)moveArm:(MoveDirection)direction; -(void)armShoot; 在Robot.m中实现这2个 ...
- Java应用服务器Resin
Resin是CAUCHO公司(http://www.caucho.com/)的产品,是一个非常流行的支持servlets 和jsp的引擎,速度非常快.Resin本身包含了一个支持HTTP/1.1的WE ...
- 安卓TV开发(十) 智能电视开发之在线视频直播
转载注明出处:http://blog.csdn.net/sk719887916/article/details/46582987 从<安卓TV开发(八) 移动智能终端多媒体之在线加载网页视频源& ...
- javascript语法之with语句
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ros_indigo使用keyboard键盘控制虚拟或实际机器人
首先,上参考网址: http://wiki.ros.org/Robots/TIAGo http://wiki.ros.org/teleop_twist_keyboard 第一个,使用TIAGo的gaz ...
- 用boost::bind构造boost::coroutine
class TestCoro { ... typedef boost::coroutines::coroutione<void ()> Coro; void CoroFun(Coro::c ...
- ITU-T Technical Paper: 测量QoS的基本网络模型
本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...
- FPGrowth
在挖掘关联规则的过程中,无可避免要处理海量的数据,也就是事务数据库如此之大,如果采用Apriori算法来挖掘,每次生成频繁k-项集的时候,可能都需要扫描事务数据库一遍,这是非常耗时的操作.那么,可以想 ...
- 加载SpriteBuilder中的scene为何不能带后缀
我们在Xcode中切换SpriteBuilder中的scene时,一般使用的是如下代码: -(void)exitButtonPressed:(CCControl*)sender{ CCLOG(@&qu ...