多态

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
 */
View Code

由例子可见,引用能够在运行时与另一个不同的对象重新绑定起来,这样一来,我们在运行期间获得了动态灵活性。与此相反,我们不能在运行期间决定继承的不同对象,因为它要求在编译期间完全确定下来。

一条通用的准则是:用继承表达行为间的差异,用字段表达状态上的变化。上述例子中两者都用到了:通过继承得到了两个不同的类,用于表达act()方法的差异;而Stage通过运用组合使自己的状态发生了变化。这种情况下,这种状态的改变也就产生了行为上的改变

posted @ 2016-04-21 11:48  Code_Bear  阅读(235)  评论(0编辑  收藏  举报