概述
在这里主要了解
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面向对象编程至此就结束了



















