Scala面向对象编程之继承

1. Scala中继承(extends)的概念

(1)、Scala 中,让子类继承父类,与 Java 一样,也是使用 extends 关键字;
(2)、继承就代表,子类可继承父类的 field 和 method ,然后子类还可以在自己的内部实现父类没有的,子类特有的 field 和method,使用继承可以有效复用代码;
(3)、子类可以覆盖父类的 field 和 method,但是如果父类用 final 修饰,或者 field 和 method 用 final 修饰,则该类是无法被继承的,或者 field 和 method 是无法被覆盖的。
(4)、private 修饰的 field 和 method 不可以被子类继承,只能在类的内部使用;
(5)、field 必须要被定义成 val 的形式才能被继承,并且还要使用 override 关键字。 因为 var 修饰的 field 是可变的,在子类中可直接引用被赋值,不需要被继承;即 val 修饰的才允许被继承,var 修饰的只允许被引用。继承就是改变、覆盖的意思。
(6)、Java 中的访问控制权限,同样适用于 Scala
举例说明:
在这里插入图片描述

2. Scala中override 和 super 关键字

(1)、Scala中,如果子类要覆盖父类中的一个非抽象方法,必须要使用 override 关键字;子类可以覆盖父类的 val 修饰的field,只要在子类中使用 override 关键字即可。
(2)、override 关键字可以帮助开发者尽早的发现代码中的错误,比如, override 修饰的父类方法的方法名拼写错误。
(3)、此外,在子类覆盖父类方法后,如果在子类中要调用父类中被覆盖的方法,则必须要使用 super 关键字,显示的指出要调用的父类方法。
举例说明:
在这里插入图片描述

3. Scala中isInstanceOf 和 asInstanceOf

如果实例化了子类的对象,但是将其赋予了父类类型的变量,在后续的过程中,又需要将父类类型的变量转换为子类类型的变量,应该如何做?
Class A extends class B
B b=new A

首先,需要使用 isInstanceOf 判断对象是否为指定类的对象,如果是的话,则可以使用 asInstanceOf 将对象转换为指定类型;
注意: p.isInstanceOf[XX] 判断 p 是否为 XX 对象的实例;p.asInstanceOf[XX] 把 p 转换成 XX 对象的实例
注意:如果没有用 isInstanceOf 先判断对象是否为指定类的实例,就直接用 asInstanceOf 转换,则可能会抛出异常;
注意:如果对象是 null,则 isInstanceOf 一定返回 false, asInstanceOf 一定返回 null;
Scala与Java类型检查和转换
举例说明:
在这里插入图片描述

4. Scala中getClass 和 classOf

Class A extends class B
B b=new A b.getClass ==classOf[A]
B b=new B b.getClass ==classOf[B]

(1)、isInstanceOf 只能判断出对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象;
(2)、如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 了;
(3)、p.getClass 可以精确地获取对象的类,classOf[XX] 可以精确的获取类,然后使用 == 操作符即可判断;
举例说明:

5. Scala中抽象类

(1)、如果在父类中,有某些方法无法立即实现,而需要依赖不同的子类来覆盖,重写实现不同的方法。此时,可以将父类中的这些方法编写成只含有方法签名,不含方法体的形式,这种形式就叫做抽象方法;
(2)、一个类中,如果含有一个抽象方法或抽象field,就必须使用abstract将类声明为抽象类,该类是不可以被实例化的;
(3)、在子类中覆盖抽象类的抽象方法时,可以不加override关键字;
举例说明:
在这里插入图片描述
注意:
1.在scala中覆盖一个抽象类中字段时,可以不写override
2.使用var定义的抽象字段只能使用var覆盖
3.使用val定义的抽象字段只能使用val覆盖
4.抽象类不一定有抽象字段或抽象方法,只需要添加abstract关键字
5.有抽象字段一定是抽象类
6.重写字段的实质是在重写字段的setter、getter方法
抽象类中可以有非抽象的方法

6. Scala中抽象field

如果在父类中,定义了field,但是没有给出初始值,则此field为抽象field;
举例说明:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值