数据学习从0到1 Scala面向对象(二)

52 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天 juejin.cn/post/716729…

对象-object

在scala中,我们可以直接定义一个object,就像定义class一样。

object:相当于class的单个实例,通常在里面放一些静态的field或者method

object不能定义带参数的constructor,只有空参的constructor

第一次调用object的方法时,会执行object的constructor,也就是执行object内部不在任何方法中的代码,因为它只有空参的构造函数

但是注意,object的constructor的代码只会在他第一次被调用时执行一次,以后再次调用就不会再执行了

object通常用于作为单例模式的实现,或者放class的一些静态成员,比如工具方法

object可以直接使用,不能new

创建一个object,使用object关键字

object Person {

var age = 1

println("this Person object!")

def getAge = age

}

执行,直接通过Object的名称调用属性或者方法即可,类似于Java中的静态类

scala> Person

this Person object!

res18: Person.type = Person$@73e776b7

scala> Person.age

res19: Int = 1

scala> Person.getAge

res20: Int = 1

伴生对象

前面学习了class和object,那下面再来看一个特殊的概念,伴生对象

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

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

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

创建一个Person object和Person class

object Person {

private val fdNum= 1

def getFdNum = fdNum

}

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

def sayHello = println("Hi, " + name + ",you are " + age + " years old!" + ", and you have " + Person.fdNum+ " friend.")

}

执行

scala> new Person("tom",20).sayHello

Hi, tom,you are 20 years old!, and you have 1 friend.

scala> Person.fdNum

:9: error: value fdNum is not a member of object Person

Person.fdNum

^

scala> Person.getFdNum

res26: Int = 1

apply

apply是object中非常重要的一个特殊方法,通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能

在创建对象的时候,就不需要使用new Class的方式,而是使用Class()的方式,隐式调用伴生对象的apply方法,这样会让对象创建更加简洁

例如:Array的伴生对象的apply方法就实现了接收可变数量的参数,以及会创建一个Array对象

val a = Array(1, 2, 3, 4, 5)

看一下文档

查看Array的源码

从Array object的源码中可以看出来,它里面就是在apply方法内部使用new Array创建的对象

main方法

接下来看一下scala中的main方法

和Java一样,在Scala中如果要运行一个应用程序,必须有一个main方法,作为入口

Scala中的main方法必须定义在object中,格式为def main(args: Array[String])

这就需要在编辑器中操作了,我们可以使用eclipse或者idea,但是eclipse对scala的支持不太好,所以建议使用idea

首先确认一下idea中是否集成了scala语言插件

打开idea,点击configure-->plugins

创建Maven项目并引入依赖

添加sdk

好,idea的scala开发环境配置好了,但是我一般还是喜欢再增加一些配置

目前项目的src目录下有一个java目录,这个目录表示是放java代码的,当然了你在里面写scala代码肯定是没有问题的。

只是针对我这种稍微有点强迫症的用起来就有点别扭了

在实际工作中可能我们一个项目既需要使用到java代码,也需要使用到scala代码,所以最好还是建议把java代码和scala代码分开存放,这样比较清晰

接口-trait

接下来看一个scala中的接口,这个接口也是比较特殊的

Scala中的接口称为trait,trait类似于Java中的interface

在triat中可以定义抽象方法

类可以使用extends 关键字继承trait,无论继承类还是trait统一都是使用extends这个关键字

类继承trait后,必须实现trait中的抽象方法,实现时不需要使用override关键字

scala不支持对类进行多继承,但是支持对trait进行多重继承,使用with关键字即可

/**

  • Created by xuwei

*/

object PersonDemo {

def main(args: Array[String]): Unit = {

val p1 = new Person("tom")

val p2 = new Person("jack")

p1.sayHello(p2.name)

p1.makeFriends(p2)

}

}

trait HelloTrait { def sayHello(name: String)}

trait MakeFriendsTrait { def makeFriends(p: Person)}

class Person(val name: String) extends HelloTrait with MakeFriendsTrait {

def sayHello(name: String) = println("Hello, " + name)

def makeFriends(p: Person) = println("Hello, my name is " + name + ", your name is " + p.name)

}

知识星球