java继承与组合

来源:互联网 发布:魅族note5 网络制式 编辑:程序博客网 时间:2024/06/06 05:49
class Actor{public void act(){System.out.println("Actor"); }public void Things(){System.out.println("no things");}}class HappyActor extends Actor{public void act(){System.out.println("HappyActor");}public void Things(){System.out.println("some happy things^_^");}}class SadActor extends Actor{public void act() {System.out.println("SadActor");}public void Things(){System.out.println("some sad things-_-");}}class Stage{public Actor actor = new HappyActor();public void change() {actor = new SadActor();}public void performPlay() {actor.act();}}public class Demo {     public static void main(String[] args) {Stage stage = new Stage();stage.performPlay();stage.actor.Things();stage.change();stage.performPlay();stage.actor.Things();} }

/*OutPut:

HappyActor

some happy things^_^

SadActor

some sad things-_-

*/

组合与继承:

从使用上来说:

    组合更加强调的是在新类中使用现有类中接口功能而非接口。当把成员对象声明成private,调用者是不会知道这个类的结构是什么,仅仅得到的是新类中的一些接口,或者调用者仅仅知道这种类有哪些行为。如果将成员对象声明为public,可想而至也是非常有意义的一件事,这样调用者就会知道这个新类是由什么对象组成的,并且在调用的时候更加明白起内涵是什么。比如stage.actor.Things();我们就会知道在这一阶段中状况,并且这个things行为是体现这个状况的。

   继承更加强调接口的重要性,继承基类并且在此基础上开发基类的导出类,所以说在没有特别强调两者类有明显的继承关系情况下,一般用组合。

从设计角度说:

   组合有很好的动态灵活性(这也是基于多态的性质),因为我们完全可以在运行的时候决定继承不同的对象,(就像上述代码public Actor actor =new  HappyActor();public void change() {actor = new SadActor();}完全可以设计程序,让程序中途调用change方法改变对象。)因此,这种方式不是是我们程序设计进入继承的层次结构中去。所以对于字段表达状态上的改变用组合。

   继承就显得并不灵活,因为我们不能在运行期间改变不同的对象,因为继承必须在编译的时候既要确定对象是谁,采纳呢个进行前期的绑定。所以如何两个类有明确的继承关系而不仅仅是状态上的改变,用继承来表达他们之间的行为的差异。


0 0