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

一、简介

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

二、Scala中的类

2.1 普通类

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

class Demo{
  val name:String="类"
  def introduce(): Unit ={
    println("这是一个"+name)
  }
}

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

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

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

//调用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)
  }
}
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中的私有化属性和私有化方法,但这时代码运行是没有问题的:

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:

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关键字来重写父类中的方法,如果要定义子类独特的方法,直接在子类的定义中书写即可:

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的实例时定义:

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)
  }
}

有缺省值的参数:

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以混入多个特质,下面是一个简单的演示:

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

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenjx85的技术专栏

leetcode-22-括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

9420
来自专栏C/C++基础

C++认识容器的迭代器

假设有个map容器,用于存储大学班级中各个家乡省份对应的学生数,key为省份中文全拼,value为学生数。现需要删除人数为0的记录,删除代码如下:

13810
来自专栏salesforce零基础学习

salesforce零基础学习(七十九)简单排序浅谈 篇一

我们在程序中经常需要对数据列表进行排序,有时候使用SOQL的order by 不一定能完全符合需求,需要对数据进行排序,排序可以有多种方式,不同的方式针对不同的...

23670
来自专栏LuckQI

学习Java基础知识,打通面试关~十二接口与抽象类

11740
来自专栏腾讯Bugly的专栏

Swift 对象内存模型探究(一)

HandyJSON 是 Swift 处理 JSON 数据的开源库之一,类似 JOSNModel,它可以直接将 JSON 数据转化为类实例在代码中使用。 由于 S...

56270
来自专栏平凡文摘

7大经典的排序算法总结实现

14920
来自专栏向治洪

Kotlin基础之泛型

泛型 与Java一样,Koltin的类也有类型参数。例如: class Box<T>(t: T){ var value = t } 常规来说,创建这样的...

20070
来自专栏Laoqi's Linux运维专列

python3–函数

62550
来自专栏菩提树下的杨过

python:函数的高级特性

23230
来自专栏程序员互动联盟

【编程基础】C++比C牛逼的七个点

1. 函数检测增强 ? 在C语言中,重复定义多个同名的全局变量是合法的,在C++中,不允许定义多个同名的全局变量。 C语言中多个同名的全局变量最终会被链接到全局...

36750

扫码关注云+社区

领取腾讯云代金券