《java编程思想系列之5》 多态

来源:互联网 发布:seo视频 编辑:程序博客网 时间:2024/05/13 01:43
一、再论向上转型

向上转型:对某个对象的引用视为对其基类的引用

忘记对象类型

二、转机

1、方法调用绑定

c方法调用:前期绑定
java方法调用:后期绑定

如果一种语言想要实现后期绑定,就必须具有某种机制,以便在运行的时候能够判断对象的类型,从而调用恰当的方法。也就说编译器一直不知道对象的类型,但是方法调用机制能够找到正确的方法体,并加以调用。

java中除了static和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。

final方法:(1)防止其他人覆盖该方法 (2)有效的关闭动态绑定

2、产生正确的行为

3、可扩展性

5、缺陷
(1)“覆盖”私有方法
结论:只有非private方法才可以被覆盖,但是还需要密切注意覆盖private方法的现象,这时候编译器虽然不会报错,但是也不会按照我们期望的来执行。确切的来说,在导出类中,对于基类中的private方法,最好采用不同的名字。

(2)域和静态方法


如果你直接访问域,这个访问就将在编译期间进行解析。当Sub对象转型为Super引用时候,任何域访问操作都将由编译器解析,因此不受多态的。

如果某个方法是静态的,它的行为就不具有多态性。

三、构造器和多态
1、构造器的调用顺序

在导出类的构造器主体中,如果没有明确指定某个基类构造器,就会“默默”的调用默认构造器。如果不存在默认构造器,编译器就会报错(若某个类没有构造器,编译器就会自动和成一个默认构造器)。

2、继承与清理

当覆盖被继承的类的dispose()方法的时候,务必要记住调用基类版本的dispose()方法,否则,基类的清理动作就不会发生。

对于基类,应该首先对其导出类进行清理,然后才是基类。这是因为导出类的清理可能会调用基类中的某些方法,所以需要使基类中的构件仍然起作用而不是过早的销毁。

成员对象共享的情况:使用引用计数来跟踪仍旧访问着共享对象的对象数量。

3、构造器内部的多态方法的行为
初始化过程:

1)在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零
2)调用基类构造器
3)按照声明的顺序调用成员的初始化方法
4)调用导出类的构造器主体

4、协变返回类型

5、用继承进行设计

优先选择“组合”

(1)纯继承与扩展
 

导出类的扩展部分不能被基类访问

2、向下转型与运行时类型识别

RTTI:运行时类型识别
在java中,所有转型都会得到检查

正如示意图所示,MoreUseful接口扩展了Useful接口;但是由于它是继承而来的,所以它也可以向上转型为Useful类型。我们在main()方法中对数组x进行初始化时候可以看到这种情况的发生。既然数组中的两个对象都属于Useful类,所以我们可以调用f()和g()方法。如果我们试图调用u()方法,就会返回一条编译时出错信息。

0 0
原创粉丝点击