【scala】基本介绍与用法(四)

目录

 

三十二、继承

定义语法

示例 | 类继承

示例 | 单例对象继承

三十三、override和super

三十四、类型判断

isInstanceOf/asInstanceOf

getClass和classOf

三十五、抽象类

抽象方法

三十六、抽象字段

三十七、匿名内部类

三十八、特质(trait)

trait作为接口使用

示例 | 继承单个trait

示例 | 继承多个trait

示例 | object继承trait

三十九、特质 | 定义具体的方法

四十、trait中定义具体的字段和抽象的字段

四十一、使用trait实现模板模式

定义

四十二、对象混入trait

四十三、trait实现调用链模式

责任链模式

trait调用链

四十四、trait继承class


三十二、继承

scala语言是支持面向对象编程的, 可以使用scala来实现继承,通过继承来减少重复代码。

定义语法

  • 使用extends关键字来实现继承
  • 可以在子类中定义父类中没有的字段和方法,或者重写父类的方法
  • 类和单例对象都可以从某个父类继承

class/object 子类 extends 父类 {

    ..

}

示例 | 类继承

  • 定义一个Person类,再定义一个Student类,继承自Person类

  • 创建一个Student类对象实例,并设置name为“张三”
  • 打印姓名
class Person {
  var name = "super"

  def getName = this.name
}

class Student extends Person

object Main13 {
  def main(args: Array[String]): Unit = {
    val p1 = new Person()
    val p2 = new Student()

    p2.name = "张三"

    println(p2.getName)
  }
}

示例 | 单例对象继承

  • 创建一个Student单例对象,让单例对象继承示例1中的Person类
  • 设置单例对象的名字为"张三",调用Student单例对象的getName方法
class Person {
  var name = "super"

  def getName = this.name
}

object Student extends Person

object Main13 {
  def main(args: Array[String]): Unit = {

    println(Student.getName)
  }
}

三十三、overridesuper

类似于Java语言, 在子类中使用override需要来重写父类的成员,可以使用super来引用父类

  • 子类要覆盖父类中的一个方法,必须要使用override关键字
  • 使用override来重写一个val字段
  • 使用super关键字来访问父类的成员方法

示例

  1. 定义一个Person类,包含
  2. 姓名字段(不可重新赋值)
  3. 获取姓名方法
  4. 定义一个Student类
  5. 重写姓名字段
  6. 重写获取姓名方法,返回"hello, " + 姓名
  7. 创建Student对象示例,调用它的getName方法
class Person {
  val name = "super"

  def getName = name
}

class Student extends Person {
  // 重写val字段
  override val name: String = "child"

  // 重写getName方法
  override def getName: String = "hello, " + super.getName
}

object Main13 {
  def main(args: Array[String]): Unit = {
    println(new Student().getName)
  }
}

三十四、类型判断

有时候,我们设计的程序,要根据变量的类型来执行对应的逻辑。

 

scala中有两种方式进行类型判断

  1. isInstanceOf
  2. getClass/classOf

isInstanceOf/asInstanceOf

在Java中,可以使用instanceof关键字来判断类型、以及(类型)object来进行类型转换,在scala中如何实现?

scala中对象提供isInstanceOf和asInstanceOf方法。

  • isInstanceOf判断对象是否为指定类的对象
  • asInstanceOf将对象转换为指定类型

用法

// 判断对象是否为指定类型

val trueOrFalse:Boolean = 对象.isInstanceOf[类型]

// 将对象转换为指定类型

val 变量 = 对象.asInstanceOf[类型]

示例

  1. 定义一个Person类
  2. 定义一个Student类继承自Person类
  3. 创建一个Student类对象
  4. 判断该对象是否为Student类型,如果是,将其转换为Student类型并打印该对象
class Person3
class Student3 extends Person3

object Main3 {
  def main(args: Array[String]): Unit = {
    val s1:Person3 = new Student3

    // 判断s1是否为Student3类型
    if(s1.isInstanceOf[Student3]) {
      // 将s1转换为Student3类型
      val s2 =  s1.asInstanceOf[Student3]
      println(s2)
    }

  }
}
 

getClassclassOf

isInstanceOf 只能判断对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象。如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。

用法

  • p.getClass可以精确获取对象的类型
  • classOf[x]可以精确获取类型
  • 使用==操作符可以直接比较类型

示例

  1. 定义一个Person类
  2. 定义一个Student类继承自Person类
  3. 创建一个Student类对象,并指定它的类型为Person类型
  4. 测试使用isInstance判断该对象是否为Person类型
  5. 测试使用getClass/classOf判断该对象是否为Person类型
  6. 测试使用getClass/classOf判断该对象是否为Student类型
class Person4
class Student4 extends Person4

object Student4{
  def main(args: Array[String]) {
    val p:Person4=new Student4
    //判断p是否为Person4类的实例
    println(p.isInstanceOf[Person4])//true

&n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值