前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(数据科学学习手札46)Scala中的面向对象

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

原创
作者头像
Feffery
发布2018-08-15 17:30:13
4400
发布2018-08-15 17:30:13
举报

一、简介

  在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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档