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

2020-09-28 19:35发布

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为“张三”

  • 打印姓名

参考代码

  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方法

  1. class Person {

  2. var name = "super"


  3. def getName = this.name

  4. }


  5. object Student extends Person


  6. object Main13 {

  7. def main(args: Array[String]): Unit = {


  8. println(Student.getName)

  9. }

  10. }

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.类型判断

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

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

1.1类型推断有两种方式:

  • isInstanceOf

  • getClass/classOf

1.1.1 第一种isInstanceOf/asInstanceOf

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

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

  • isInstanceOf判断对象是否为指定类的对象

  • asInstanceOf将对象转换为指定类型

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

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

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

  4. 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. }

作者:涤生手记

链接:https://blog.csdn.net/qq_26442553/article/details/108405244

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。