Scala--继承--笔记

重写方法
Scala中明确规定,重写一个非抽象方法必须需要用override 修饰符。

调用超类的方法使用关键字super

Scala中类型检查和转换
isInstanceOf[ ] 测试某个对象是否属于某个给定的类:
asInstanceOf[ ] 将某个对象强制转换为某个类型
classOf[ ] 获取对象的类名:
在这里插入图片描述
超类构造

Java 中超类构造
在Java中,创建子类对象时,子类的构造器总是去调用一个父类的构造器(显式或是隐式调用)
在这里插入图片描述

Scala中超类构造
Scala中超类的构造说明:
1)类有一个主构造器和任意数量的辅助构造器,而每个辅助构造器都必须先调用主构造器(也可以时间接调用)
在这里插入图片描述
2)只有主构造器才可以调用父类的构造器,辅助构造器不能直接调用父类的构造器
在Scala中不能调用super(params)
子类可以将参数传给父类
子类的参数列表可以和继承的父类不一致
在这里插入图片描述
覆写字段
在Scala中,子类改写父类的字段,我们称为覆写/重写字段。
覆写字段需使用 override 修饰
注意:在 Java 中只有方法的重写,没有属性/字段的重写,准确的讲,
隐藏字段代替了重写
在这里插入图片描述
Java 的动态绑定机制:
1.如果调用的是方法,Jvm机 会将该方法和对象的内存地址绑定。即对象是谁的,就调用谁的方法
2.如果调用的是一个属性,则没有动态绑定机制,在哪里调用,就返回对应值。
案例:
在这里插入图片描述
如果将子类的sum()方法删除,obj 调用sum()时会默认调用父类的sum()方法。
注意,父类中有getI()方法,
在这里插入图片描述

若将sum1也删除
在这里插入图片描述
Scala覆写字段
覆写字段前必须加上 override
在这里插入图片描述

覆写字段代码:
在这里插入图片描述

覆写字段的注意事项和细节
1)def 只能重写另一个 def(方法只能重写另一个方法)
在这里插入图片描述

2)子类的属性可以重写父类的方法,但是类型需要一致,
在这里插入图片描述
如果类型不一致,就会出错:
在这里插入图片描述
3)val 只能重写另一个 val 属性,或者重写不带参数的 def(带参数的相当于方法重载)

因为如果父类的属性是var,在底层就会生成 xxx(),xxx_KaTeX parse error: Expected group after '_' at position 44: …getter() 方法 xxx_̲eq() 相当于 Java 的setter() 方法**
而子类的属性若是val,在底层只会生成xxx() 方法,即在别的地方只可以查看而不可修改
但如果继承成功,子类会继承父类的 xxx_$eq() 方法,在别的地方就可以修改val xxx的值

4)var 只能重写另一个抽象的 var 属性,不是抽象的不能用 var 重写
在子类中重写父类的抽象属性本质上是重写了父类属性的方法
在这里插入图片描述
如果A是抽象类,name是抽象属性,则没有问题
在这里插入图片描述

抽象类

基本介绍:
Scala中,通过abstract 关键字标记不能被实例化的类
抽象方法:抽象方法不用标记abstract ,只要省略掉方法体即可。
抽象字段/属性:抽象类可以拥有抽象字段/属性,抽象字段/属性就是没有初始值的字段/属性


抽象类的价值更多在于设计,设计者设计好后,让子类继承并实现抽象类(即抽象类的抽象方法)

Scala中抽象类使用的注意事项和细节讨论
1)抽象类不能被实例
这里的实例是说不能
var
在实例化时,动态的实现了抽象类的所有抽象方法时,也可以这样,即使用匿名子类,下面有匿名子类的介绍
在这里插入图片描述

2)抽象类不一定要包含abstract 方法,也就是说,抽象类可以没有abstract 方法

3)一旦类中包含了抽象方法或者抽象属性,则这个类必须声明为abstract

4)抽象方法不能有主体,不允许使用abstract 修饰

5)如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法和抽象属性(没有初始化的属性),除非它自己也是 abstract 类

6)抽象方法和抽象属性不能使用private, final 来修饰,因为这些关键字都是和重写/实现相违背的

7)抽象类中可以有实现的方法

8)子类重写抽象方法不需要 override ,写上也不会错

匿名子类

和Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类
创建的子类可能只是临时使用一下
可以使用匿名子类为抽象类创建实例
在这里插入图片描述
继承层次:
在这里插入图片描述
继承层级图小结:
1)Scala 中,所有其他类都是AnyRef 的子类,类似Java 的Object
2)AnyVal 和 AnyRef 都扩展姿 Any 类, Any 类时根节点
3)Any 中定义了 isInstanceOf .anInstanceOf 方法,以及 哈希方法等
4)Null 类型的唯一实例就是null 对象,可以将 null 赋值给任何引用,但不能赋值给值类型的变量
5)Nothing 类型没有实例,它对于泛型结构是有用处的。
例如:空列表Nil 的类型是List[Nothing],它是List[T] 的字类型,T 可以是任何类

–学习韩顺平老师Scala课程的笔记

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值