1. 动态绑定
若子类SubClass覆盖了父类SuperClass的某个非final非private方法f1()
即使子类被声明为
SuperClass child = new SubClass();
使用child.f1()时仍然访问子类的f1()
2. 如果把某个方法声明为final,可以防止其他人覆盖该方法。更为重要的一点是,这样做可以有效的关闭动态绑定,从而生成更有效的代码。然而,大多数情况下,这样做对程序的整体性能不会有什么改观。因此并不提倡为了仅仅提高性能而使用final。
3. private方法无法被覆盖,但还是要注意覆盖private方法的现象,上面的例子中,如SuperClass中含有private方法f2(),而子类中也声明了同名的方法f2(),子类被声明为
SuperClass child = new SubClass();
child.f2()时访问了父类的f2()
4. 构造器和多态
构造器基本顺序:
1)调用基类构造器(递归过程)
2)按声明顺序调用成员的初始化方法。
3)调用导出类构造器的主体。
5. 继承与清理
通过组合与京城方法来创建新类时,不必担心对象的清理问题。如果确实遇到清理的问题,那么必须为新类创建dispose()方法。当覆盖被继承类的dispose()方法时,务必记住调用基类的dispose()方法,也要注意清理顺序。
6. 构造器内部的多态方法的行为
如果要调用构造器内部的一个动态绑定的方法,就要用到那个方法的被覆盖后的定义。然而,产生的效果可能相当难于预料,并且可能造成一些难于发现的隐藏错误。
在任何构造器的内部,整个对象可能只是部分形成,然而一个动态绑定的方法调用却会向外深入到继承层次结构内部,它可以调用导出类的方法。如果在构造器里这么做,那么就可能会调用某个方法,而这个方法所操纵的成员可能还未初始化--这肯定会出问题。
import com.bruceeckel.simpletest.*;
abstract class Glyph {
abstract void draw();
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(
"RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println(
"RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
最后显示
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
实际应用中,或许这会导致RoundGlyph对象生成后只画了一个点,而不是预期的半径为1的圆。
解释:初始化的实际过程是:
1)将分配给对象的储存空间初始化为二进制的0。
2)调用基类构造器。即此时调用了draw()方法,但radius仍然为0。
3)按照声明的顺序调用成员的初始化方法。
4)调用导出类的构造器主体。
逻辑方法已经十分完美,但行为却会出错(这种情况下,C++会产生更合理的行为)
因此,编写构造器有一条有效的准则:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。在构造器内唯一能够安全调用的那些方法是基类中的final方法(包括private方法),这些方法不能被覆盖,也就不会出现上述问题。
7. 依然是继承/组合的选择
一条通用的准则是,用继承表达行为间的差异,用字段表达状态上的变化。
8. 纯继承:只有在基类或接口中已经建立的方法才可以在导出类中被覆盖,基类与导出类的接口相同。
9. 向下转型

posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2.18 Java notes - Polymorphism

Posted on 2007-04-22 20:24 ZelluX 阅读(285) 评论(0)  编辑  收藏 所属分类: OOP
2007-02-18 22:08:25
只有注册用户登录后才能发表评论。


网站导航: