8.Scala面向对象编程
概述
在这里主要了解
Scala
中的类、对象和接口
Scala
中类和java
中的类基本是类似的Scala
中的对象是需要定义
的,而java
中的对象是通过class new
出来的Scala
中的接口是trait
,java
中的接口是interface
相关链接
阅读之前,可以浏览一下
scala相关文章
类-class
类
class
前面以前已经详细说明,点此链接浏览
scala类
scala辅助构造器与为构造函数提供默认值(一)
对象-object
前面的scala
中的class
和java
中的class
是类似的,下面来看一个java
中没有的内容,叫object
可能有疑问了,Java
中也有object
,通过class
就可以创建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
}
伴生对象
前面了解了class
和object
,那下面再来看一个特殊的概念,伴生对象
如果有一个class
,还有一个与class
同名的object
,那么就称这个object
是class
的 伴生对象
,class
是object
的 伴生类
注意: 伴生类和伴生对象必须存放在一个
.scala
文件之中
伴生类中可以访问伴生对象中的private field
创建一个Person object
和Person class
package com.fun.scala
class Person(val name:String,val age:Int) {
private val strM ="测试"
def sayHello = println("Hi, " + name + ",you are " + age + " years old!" + ", and you have " + Person.fdNum+ " friend.")
}
object Person{
private val fdNum =1
def getFdNum = fdNum
def main(args: Array[String]): Unit = {
new Person("long",33).sayHello
}
}
apply
apply
是object
中非常重要的一个特殊方法,通常在伴生对象中实现apply
方法,并在其中实现构造伴生类对象
的功能
在创建对象的时候,就不需要使用new Class
的方式,而是使用Class()
的方式,隐式调用伴生对象的apply
方法,这样会让对象创建更加简洁
例如:Array
的伴生对象的apply
方法就实现了接收可变数量的参数,以及会创建一个Array对象
val a = Array(1, 2, 3, 4, 5)
官方文档
源码如下
对上面Person
伴生对象进行改造
object Person {
private val fdNum = 1
def getFdNum = fdNum
def apply(name: String) = {
println("apply exec...")
new Person(name, 33)
}
def main(args: Array[String]): Unit = {
Person("张").sayHello
}
}
接口-trait
接下来看一个scala
中的接口,这个接口也是比较特殊的
Scala
中的接口称为trait
,trait
类似于Java
中的interface
在triat
中可以定义抽象方法
类可以使用extends
关键字继承trait
,无论继承类还是trait
统一都是使用extends
这个关键字
类继承trait
后,必须实现trait
中的抽象方法,实现时不需要使用override
关键字
scala
不支持对类进行多继承,但是支持对trait
进行多重继承,使用with
关键字即可
package com.fun.scala
object PersonDemo {
def main(args: Array[String]): Unit = {
val p1 = new PersonX("tom")
val p2 = new PersonX("jack")
p1.sayHello(p2.name)
p1.makeFriends(p2)
}
}
trait HelloTrait { def sayHello(name: String)}
trait MakeFriendsTrait { def makeFriends(p: PersonX)}
class PersonX(val name: String) extends HelloTrait with MakeFriendsTrait {
def sayHello(name: String) = println("Hello, " + name)
def makeFriends(p: PersonX) = println("Hello, my name is " + name + ", your name is " + p.name)
}
结束
Scala
面向对象编程至此就结束了