Scala入门系列(六):面向对象之object

object

object相当于class的单个实例,类似于Java中的static,通常在里面放一些静态的field和method。 
  
第一次调用object中的方法时,会执行object的constructor,也就是object内部不在method或者代码块中的所有代码,但是object不能定义接受参数的constructor 

注意:object的构造函数只会在第一次被调用时被执行一次,这点类似Java类中static的初始化。


object Person { 

private var eyeNum = 2 

println("this Person object") 

def getEyeNum = eyeNum 

} 

defined module Person 

// 第一次调用会初始化 

scala> Person.getEyeNum 

this Person object 

res14: Int = 2 

// 第二次都没有再执行初始化 

scala> Person.getEyeNum 

res15: Int = 2 

伴生对象、伴生类

如果有一个class, 还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类。

伴生类和伴生对象必须存放在一个.scala文件中

伴生类和伴生对象最大的特点在于,可以互相访问Private field


object Person{ 

private val eyeNum = 2 

def getEyeNum = eyeNum 

} 

class Person(val name: String, val age: Int){ 

def sayHello = println("Hi," + name + ", I guess you must have " + Person.eyeNum + " eyes.") // 访问同名object私有字段 

} 

defined module Person 

defined class Person 

scala> val s = new Person("sparks", 30) 

s: Person = Person@3b30eec5 

scala> s.sayHello 

Hi,sparks, I guess you must have 2 eyes. 

apply方法(重要)

object中非常重要的一个特殊方法。 
通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能;这样在创建伴生类对象时,可以使用Class()方式(而不仅仅是new Class方式),原理是隐式地调用了伴生对象的apply方法,让对象创建更加简洁。


class Person(val name: String) 

object Person{ 

def apply(name: String) = new Person(name) 

} 

defined class Person 

defined module Person 

// 可以直接使用Class()方式创建对象。 

scala> val test = Person("sparks") 

test: Person = Person@7cdfa824 

main方法

在scala中,如果要运行一个应用程序,那么必须有一个main方法,作为入口

scala中main方法定义为def main(args: Array[String]), 并且必须定义在object中


object HelloWorld { 

def main(args: Array[String]){ 

println("Hello, Wrold") 

} 

} 

除了自己实现main方法外,还可以继承App Trait,然后将需要在main方法中运行的代码,直接作为object的constructor代码,而且用args可以接受传入的参数


object HelloWorld extends App { 

if (args.length > 0) println("hello, " + args(0)) 

else println("HelloWorld") 

} 

如果要运行上述代码,需要将其放入.scala文件,然后使用scalac编译,再用scala执行。


// 编译 

scalac HelloWorld.scala 

// 运行(输出运行所花费的时间) 

scala -Dscala.time HelloWorld 

App Trait的工作原理为: App Trait继承自DelayedInit Trait,scalac命令进行编译时,会把继承App Trait的object的constructor代码都放到DelayedInit Trait的dealyedInit方法中执行。

用object来实现枚举功能

Scala没有直接提供类似于Java中的Enum枚举特性,如果要实现枚举,则需要用object继承Enumeration类,并且调用Value方法来初始化枚举值。


object Season extends Enumeration { 

val SPRINT, SUMMER, AUTUMN, WINTER = Value 

} 

defined module Season 

scala> Season.SPRINT 

res17: Season.Value = SPRINT 

// 还可以通过Value传入枚举值的id和name,通过id和toString来获取 

object Season extends Enumeration { 

val SPRINT = Value(0, "spring") 

val SUMMER = Value(1, "summer") 

val AUTUMN = Value(2, "autumn") 

val WINTER = Value(3, "winter") 

} 

defined module Season 

scala> Season.SPRINT.id 

res20: Int = 0 

scala> Season.SPRINT.toString 

res21: String = spring 

scala> Season(0) 

res22: Season.Value = spring 

scala> Season(2) 

res23: Season.Value = autumn 

scala> Season.withName("winter") 

res24: Season.Value = winter 

// 使用枚举object.values 可以遍历枚举值 

scala> for (ele <- Season.values ) println(ele) 

spring 

summer 

autumn 

winter

时间: 2024-10-05 05:50:02

Scala入门系列(六):面向对象之object的相关文章

python入门系列:面向对象

类和对象的创建 类 经典类 没有继承 object的类 新式类 继承了 object的类 class Money: # 2.x中默认是经典类,3.x中是新式类pass class Money(object): # 兼容的一种写法pass Money既是类的name属性名,又是一个引用该类的变量 print(Money.name) # Moneyxxx = Moneyprint(xxx.name) # Money对象 one = Money()print(one) # <main.Money ob

C语言快速入门系列(六)

C语言快速入门系列(五) C语言指针加强 本节引言: 上一节我们对C语言中的指针进行了初步的了解,学习了指针的定义,与普通变量 一维数组,二维数组,字符串之间的使用!在本节中我们将会学习一些新的知识点, 函数,结构体与共用体,枚举类型以及类型定义符typedef! 本节学习路线图: 本节正文 函数 ps:空函数就是什么都不做的函数,开发过程中不需要马上实现的,先写空函数!简单的空函数:void abc(){   } 结构体 共用体: 代码示例2: 建立一个共用体类型,当输入的时学生类型时,要求输

Scala入门系列(九):函数式编程

引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直没有替代Java,一是因为Java诞生早,基于Java开发了大量知名的工程,并且最重要的是Java现在不只是一门编程语言,而是一个庞大的技术生态圈,所以未来十年内Scala也不会完全替代Java,但是Scala会在自己特有的领域大发光彩.   将函数赋值给变量 Scala中函数是一等公民,可以独立定

Scala入门系列(八):面向对象之trait

基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持对类进行多继承,但是支持多重继承trait,使用with关键字即可 trait HelloTrait{ def sayHello(name: String) } trait MakeFriends{ def makeFriends(p: Person) } class Person(val name

Scala入门系列(十三):类型参数

引言 Scala中类型参数是什么呢?其实就类似于Java中的泛型.定义一种类型参数,比如在集合.类.函数中定义类型参数,然后就可以保证使用到该类型参数的地方就只能是这种类型,从而实现程序更好的健壮性.   泛型类 泛型类,顾名思义,其实就是在类的声明中,定义一些泛型类型,然后在类内部,比如field或method,就可以使用这些泛型类型. 使用泛型类,通常是需要对类中的某些成员,比如某些field和method中的参数或变量,进行统一的类型限制,这样可以保证程序更好的健壮性和稳定性. 在使用类的

Scala入门系列(三):数组

Array 与Java的Array类似,也是长度不可变的数组,此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组. 注意:访问数组中元素使用()而不是Java中的 [] scala> val a = new Array[String](10) a: Array[String] = Array(null, null, null, null, null, null, null, null, null, n ull) scala> val

Spring Boot入门系列六( SpringBoot 整合thymeleaf)

SpringBoot 整合thymeleaf 一.什么是Thymeleaf模板 Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎.类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎.与其它模板引擎相比,Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用.它的功能特性如下: @Controller中的方法可以直接返回模板名称,接下来Thyme

Python3快速入门(六)——Python3面向对象

Python3快速入门(六)--Python3面向对象 一.面向对象技术简介 1.面向对象简介 面向对象编程(Object Oriented Programing,OOP)是一种编程思想,OOP把对象当成程序的一个基本单元,一个对象包含数据和操作数据的方法.面向对象编程的三大特性如下:A.封装,可以隐藏实现细节,使代码模块化.B.继承,可以通过扩展已存在的类来实现代码重用,避免重复编写相同的代码.C.多态,封装和继承的目的都是为了实现代码重用, 而多态是为了实现接口重用,使得类在继承和派生的时候

HTML5简单入门系列(六)

前言 之前几篇已经将HTML5的主要新增元素和特性简单介绍完毕,LZ一直在犹豫还要不要把其他元素也写出来,因为其实没什么东西可以写,就是自己用到时看一下就行.不过为了入门系列的完整,犹豫再三,还是决定简单写一下其他元素(看到其他深入的HTML5,LZ就不写到这里了,因为LZ也没掌握,这里有篇深入剖析HTML5,各位可以看看). HTML5 新增元素介绍 input类型 新增的输入类型元素有: email url number range Date pickers (date, month, we