Scala系列14:scala继承,重写,super,类型推断等使用详解

偏执的太偏执、 2022-12-04 01:03 241阅读 0赞

0.Scala继承

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

0.1定义语法

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

语法

  1. class/object 子类 extends 父类 {
  2. ..
  3. }
  4. Copy
  5. 示例

0.2示例 | 类继承

  • 定义一个Person类,再定义一个Student类,继承自Person类
  • 创建一个Student类对象实例,并设置name为“张三”
  • 打印姓名

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI2NDQyNTUz_size_16_color_FFFFFF_t_70

参考代码

  1. package com.robot.scalademo1
  2. class Person3
  3. class Student3 extends Person3
  4. object _08ObjectDemo {
  5. class Person {
  6. var name = "super"
  7. def getName = this.name
  8. }
  9. class Student extends Person //注意如果类没有实体,可以省略{}
  10. def main(args: Array[String]): Unit = {
  11. val p1 = new Person()
  12. val p2 = new Student()
  13. val p3:Student = new Student() //注意这种写法,和上面的写法一样,主要前后类型一致,可以省略。如果不一致,则不可以省略
  14. p2.name = "张三"
  15. p3.name ="tom "
  16. println(p2.getName)
  17. println(p3.getName)
  18. /**结果如下:
  19. * 张三
  20. tom
  21. */
  22. /
  23. }
  24. }

0.3 示例 | 单例对象继承

示例说明

  • 创建一个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 = {

    1. println(Student.getName)

    }
    }

1.override和super

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

1.1 用法

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

1.2 示例

  • 定义一个Person类,包含

    • 姓名字段(不可重新赋值)
    • 获取姓名方法
  • 定义一个Student类

    • 重写姓名字段
    • 重写获取姓名方法,返回”hello, “ + 姓名
  • 创建Student对象示例,调用它的getName方法

参考代码

  1. object _08ObjectDemo {
  2. class Person {
  3. val name = "super"
  4. def getName = name
  5. }
  6. class Student extends Person {
  7. // 重写val字段
  8. override val name: String = "child"
  9. // 重写getName方法
  10. override def getName: String = "hello, " + super.getName
  11. }
  12. def main(args: Array[String]): Unit = {
  13. println(new Student().getName) //hello, child
  14. }
  15. }

1.类型判断

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI2NDQyNTUz_size_16_color_FFFFFF_t_70 1

在scala中,如何来进行类型判断呢?

1.1类型推断有两种方式:

  • isInstanceOf
  • getClass/classOf

1.1.1 第一种isInstanceOf/asInstanceOf

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

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

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

    // 判断对象是否为指定类型
    val trueOrFalse:Boolean = 对象.isInstanceOf[类型]
    // 将对象转换为指定类型
    val 变量 = 对象.asInstanceOf[类型]

1.1.2 isInstanceOf/asInstanceOf演示

示例说明

  • 定义一个Person类
  • 定义一个Student类继承自Person类
  • 创建一个Student类对象
  • 判断该对象是否为Student类型,如果是,将其转换为Student类型并打印该对象

参考代码

  1. package com.robot.scalademo1
  2. class Person3
  3. class Student3 extends Person3
  4. object _08ObjectDemo {
  5. def main(args: Array[String]): Unit = {
  6. val s1:Person3 = new Student3 //注意这种写法,申明s1的类型是Person3,最终指向却是Student3.
  7. // 判断s1是否为Student3类型
  8. if(s1.isInstanceOf[Student3]) {
  9. // 将s1转换为Student3类型
  10. val s2 = s1.asInstanceOf[Student3]
  11. println(s2) //com.robot.scalademo1.Student3@6366ebe0
  12. }
  13. }

1.2 getClass和classOf

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

1.2.1 用法

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

1.2.2 示例

示例说明

  • 定义一个Person类
  • 定义一个Student类继承自Person类
  • 创建一个Student类对象,并指定它的类型为Person类型
  • 测试使用isInstance判断该对象是否为Person类型
  • 测试使用getClass/classOf判断该对象是否为Person类型
  • 测试使用getClass/classOf判断该对象是否为Student类型

参考代码

  1. class Person4
  2. class Student4 extends Person4
  3. object Student4{
  4. def main(args: Array[String]) {
  5. val p:Person4=new Student4
  6. //判断p是否为Person4类的实例
  7. println(p.isInstanceOf[Person4])//true
  8. //判断p的类型是否为Person4类
  9. println(p.getClass == classOf[Person4])//false
  10. //判断p的类型是否为Student4类
  11. println(p.getClass == classOf[Student4])//true
  12. }
  13. }

发表评论

表情:
评论列表 (有 0 条评论,241人围观)

还没有评论,来说两句吧...

相关阅读

    相关 继承--super

     继承:        表示父类跟子类之间的关系        当两个类或者多个类具备相同的属性和方法的时候,可以提取出来,变成父类,子类可以继承        子类跟父

    相关 scala 继承

    继承 抽象类:abstract class ,抽象类中可以有抽象字段、非抽象字段、抽象方法、非抽象方法。 重写抽象字段、抽象方法时,可以不带override关键字;重写非抽