第八章 多态

在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种特征
1.再论向上转型
对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用
1.1忘记对象类型
2.转机
2.1方法调用绑定
绑定:将一个方法调用同一个方法主体关联起来
前期绑定:若在程序秩序井前绑定(面向过程:默认的绑定方式)
后期绑定:在运行时根据对象的类型进行绑定(动态绑定或运行时绑定)
Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定
2.2产生正确的行为
创建导出类并赋值给基类引用,基类调用被导出类覆盖的方法时,将会调用导出类的方法的实现
2.3可扩展性
通过基类继承出来的子类,只需覆盖基类的方法,通过基类就可以直接调用
2.4缺陷:“覆盖”私有方法
只有非private方法才可以被覆盖,但是还需要密切注意private方法的现象,这时虽然编译不会报错,但是也不会按照我们期望的来执行。确切地说,在导出类中,对于基类的private方法,最好采用不同的名字。
2.5缺陷:域与静态方法
只有普通的方法调用可以是多态的
如果你直接访问某个域,这个访问就将在编译期进行解析,不具有多态型
如果某个方法是静态的,它的行为就不具有多态性
3.构造器和多态
尽管构造器并不具有多态性(它们实际上是static方法,只不过该static声明是隐式的),但还是非常有必要理解构造器怎样通过多态在复杂的层次结构中运作
3.1构造器的调用顺序
基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上连接,以使每个基类的构造器都能得到调用。
3.2继承与清理
通过组合和继承方法来创建新类时,永远不必担心对象的清理问题,子对象通常都会留给垃圾回收器进行处理。如果确实遇到清理的问题,那么必须用心为新类创建dispose()方法。在导出类中覆盖dispose()方法时,务必记住调用基类版本的dispose()

编写构造器时有一个有效的准则:“用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法”。在构造器内唯一能够安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final方法)
4.协变返回类型
Java SE5中添加了协变返回类型,即在导出类中被覆盖方法可以返回基类方法的返回类型的某种导出类型
5.用继承进行设计
当我们使用现成的类建立新类时,,如果首先考虑使用继承技术,反倒会加重我们的设计负担,更好的方式是首先选择“组合”,尤其是不能十分确定应该使用哪一种方式时。
一条通用的准则是:“用继承表达行为间的差异,并用字段表达状态上的变化”。
5.1纯继承与扩展
采用“纯粹”的方式创建继承层次结构似乎是最好的方式。也就是说,只有基类中已经建立的方法才可以在导出类中被覆盖,“is-a”
但是extends,允许我们扩展接口,“is-lie-a”,这有一个缺点:在导出类中接口扩展部分不能被基类访问
5.2向下转型与运行时类型识别
在Java语言中,所有转型都会得到检查,所以使我们只是进行一次普通的加括弧形式的类型转换,在进入运行期时仍然会对其进行
检查,以便保证它的确是我们希望的那种类型。如果不是,就会返回一个ClassCastExecption(类转型异常)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值