(数据科学学习手札46)Scala中的面向对象

2018-08-15 17:30:13 浏览数 (1)

一、简介

  在Scala看来,一切皆是对象,对象是Scala的核心,Scala面向对象涉及到class、object、构造器等,本文就将对class中的重点内容进行介绍;

二、Scala中的类

2.1 普通类

  在Scala中定义普通类的方式如下面的示例:

代码语言:javascript复制
class Demo{
  val name:String="类"
  def introduce(): Unit ={
    println("这是一个" name)
  }
}

  即class 类名 {类中的内容,包括类自带的变量,自带的方法},而在class的定义中,也有一些特殊的方法:

  1、private定义私有属性和方法

  在class中定义属性或方法时在开头加上private关键词,则会将对应的属性或方法私有化,即只允许class中的方法调用该属性或方法:

代码语言:javascript复制
//调用class中的非私有化属性和方法
object main{
  def main(args: Array[String]): Unit = {
    val demo = new Demo
    demo.introduce()
    println(demo.name)
  }
}

class Demo{
  val name:String="类"
  def introduce(): Unit ={
    println("这是一个" name)
  }
}
代码语言:javascript复制
object main{
  def main(args: Array[String]): Unit = {
    val demo = new Demo
    //尝试调用class中的私用化属性和方法
    println(demo.B)
    println(demo.x)
  }
}

class Demo{
  private val x:Int=1
  def A: Int ={
    B   x
  }
  private def B: Int ={
    2
  }
}

而调用非私有化的方法,虽然该方法中调用了class中的私有化属性和私有化方法,但这时代码运行是没有问题的:

代码语言:javascript复制
object main{
  def main(args: Array[String]): Unit = {
    val demo = new Demo
    //尝试调用class中的私用化属性和方法
    println(demo.A)

  }
}

class Demo{
  private val x:Int=1
  def A: Int ={
    B   x
  }
  private def B: Int ={
    2
  }
}

  2、类的继承

  在Scala中,继承的关键字是extends:

代码语言:javascript复制
object main{
  def main(args: Array[String]): Unit = {
    //调用父类中的introduce方法
    val demoFather = new Father
    demoFather.introduce
    //调用子类1中继承自父类的introduce方法
    val demoChild1 = new Child1
    demoChild1.introduce
  }
}

//父类
class Father{
  val name:String="father"
  def introduce: Unit ={
    println(name)
  }
}

//子类1
class Child1 extends Father{

}

  子类通过override关键字来重写父类中的方法,如果要定义子类独特的方法,直接在子类的定义中书写即可:

代码语言:javascript复制
object main{
  def main(args: Array[String]): Unit = {
    //调用父类中的introduce方法
    val demoFather = new Father
    demoFather.introduce
    //调用子类1中继承自父类的introduce方法
    val demoChild1 = new Child1
    demoChild1.introduce
    //调用子类1中自主的新方法
    demoChild1.unique
  }
}

//父类
class Father{
  val name:String="father"
  def introduce: Unit ={
    println(name)
  }
}

//子类1
class Child1 extends Father{
  //复写父类中继承来的方法和属性
  override val name: String = "son"
  override def introduce: Unit = {
    println(name)
  }
  def unique: Unit ={
    println("I am unique!")
  }
}

  在父类中,被关键词final修饰的属性和方法不能被子类重写会提示错误:

  3、class的传入参数

  Scala中的class可以像定义函数一样传入一些必要或非必要参数,如下例:

无缺省值的参数,必须在初始化class的实例时定义:

代码语言:javascript复制
object main{
  def main(args: Array[String]): Unit = {
    //初始化类的实例时传入无缺省必要参数
    val demoFather = new Father(Firstname = "Zhang")
    //调用类中的introduce方法
    demoFather.introduce
  }
}

class Father(Firstname:String){
  val Lastname:String="feifei"
  def introduce: Unit ={
    println(this.Firstname Lastname)
  }
}

有缺省值的参数:

代码语言:javascript复制
object main{
  def main(args: Array[String]): Unit = {
    //调用类中的introduce方法,这里的参数有缺省值可以不传入
    val demoFather = new Father()
    demoFather.introduce
  }
}

class Father(Firstname:String="Wang"){
  val Lastname:String="feifei"
  def introduce: Unit ={
    println(this.Firstname Lastname)
  }
}

2.2 特质与混入

  Scala中的特质用trait关键字来定义,混入用extends的方式,通过with以混入多个特质,下面是一个简单的演示:

代码语言:javascript复制
object main{
  def main(args: Array[String]): Unit = {
    //调用混入后的方法
    val vehicle = new Vehicle
    vehicle.brand
    vehicle.Amount
    vehicle.amount
  }
}

//特质1
trait Car{
  def brand: Unit ={
    println("本田")
  }
}

//特质2
trait Wheel{
  def amount: Unit ={
    println("4个轮子")
  }
}

//特质3
trait Glass{
  def Amount: Unit ={
    println("深灰色的玻璃")
  }
}

//混入三个特质
class Vehicle extends Car with Wheel with Glass

  以上就是本文的全部内容,若有笔误之处,望指出。

0 人点赞