多态
1.在编写构造器时,有一条有效的准则:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。在构造器内唯一能够安全调用的那些方法是基类中的“final”方法(也适用于“private”方法,它自动属于“final”方法),因为这些方法不能被覆盖。
2.学习了多态后,在使用现成类来建立新类时,还是应该优先选择组合方式,特别是不能十分确定应该使用哪种方式时,因为组合不会强制程序设计进入继承的层次结构中,因而更加灵活,它可以动态地选择类型(因而动态地选择了行为);但是,继承在编译时就需要知道确切的类型,例:
package practice; class Actor{ public void act() { } } class HappyActor extends Actor{ @Override public void act() { System.out.println("HappyActor"); } } class SadActor extends Actor{ @Override public void act() { System.out.println("SadActor"); } } class Stage{ private Actor actor= new HappyActor(); public void change() { actor = new SadActor(); } public void performPlay() { actor.act(); } } public class Transmogrify { public static void main(String[] args) { // TODO Auto-generated method stub Stage stage = new Stage(); stage.performPlay(); stage.change(); stage.performPlay(); } } /*output: * HappyActor * SadActor */
由例子可见,引用能够在运行时与另一个不同的对象重新绑定起来,这样一来,我们在运行期间获得了动态灵活性。与此相反,我们不能在运行期间决定继承的不同对象,因为它要求在编译期间完全确定下来。
一条通用的准则是:用继承表达行为间的差异,用字段表达状态上的变化。上述例子中两者都用到了:通过继承得到了两个不同的类,用于表达act()方法的差异;而Stage通过运用组合使自己的状态发生了变化。这种情况下,这种状态的改变也就产生了行为上的改变