8.Scala面向对象编程

概述

在这里主要了解Scala中的类、对象和接口

  • Scala中类和java中的类基本是类似的
  • Scala中的对象是需要定义的,而java中的对象是通过class new出来的
  • Scala中的接口是traitjava中的接口是interface

相关链接

阅读之前,可以浏览一下

scala相关文章

类-class

class 前面以前已经详细说明,点此链接浏览

scala类
scala辅助构造器与为构造函数提供默认值(一)

对象-object

前面的scala中的classjava中的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 
}

8.Scala面向对象编程_第1张图片

伴生对象

前面了解了classobject,那下面再来看一个特殊的概念,伴生对象
如果有一个class,还有一个与class同名的object,那么就称这个objectclass伴生对象classobject伴生类

注意: 伴生类和伴生对象必须存放在一个.scala文件之中
伴生类中可以访问伴生对象中的private field

创建一个Person objectPerson 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
  }
}		

8.Scala面向对象编程_第2张图片

apply

applyobject中非常重要的一个特殊方法,通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能
在创建对象的时候,就不需要使用new Class的方式,而是使用Class()的方式,隐式调用伴生对象的apply方法,这样会让对象创建更加简洁

例如:Array的伴生对象的apply方法就实现了接收可变数量的参数,以及会创建一个Array对象
val a = Array(1, 2, 3, 4, 5)

官方文档
8.Scala面向对象编程_第3张图片
源码如下
8.Scala面向对象编程_第4张图片
对上面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
  }
}

8.Scala面向对象编程_第5张图片

接口-trait

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

Scala中的接口称为traittrait类似于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)
}

8.Scala面向对象编程_第6张图片

结束

Scala面向对象编程至此就结束了

你可能感兴趣的:(大数据,scala,大数据)