java-组合优于继承

组合和继承,都能实现对类的扩展。

区别如下表所示

组合 继承
has-a关系 is-a关系
运行期决定 编译期决定
不破坏封装,整体和局部松耦合 破坏封装,子类依赖父类
支持扩展,随意增加组合类 只能继承一个父类,必须包含所有方法,增加系统复杂性
动态选择组合类方法 复用父类方法

下面通过一个例子说明,子类继承必须包含所有父类方法,增加了出错率,修改父类方法会引起所有子类功能变化。

/**
 * 呼叫基类
 *
 * @author peter_wang
 * @create-time 2014-5-20 下午4:30:33
 */
public class SuperCallClass {

    public void call() {
    }

    public void operate1() {
        System.out.println("operate1 in super class");
    }

    public void operate2() {
        System.out.println("operate2 in super class");
    }

    /**
     * 冗余的函数,导致子类臃肿,破坏了封装,增加了出错机会
     */
    public void redundant() {
        System.out.println("redundant in super class");
    }
}
/**
 * 呼叫子类
 * 
 * @author peter_wang
 * @create-time 2014-5-20 下午4:32:22
 */
public class SubCallClass
    extends SuperCallClass {

    @Override
    public void operate1() {
        //破坏了封装,无意中引入了基类方法
        super.operate1();
        System.out.println("operate in sub class");
    }

    @Override
    public void call() {
        super.call();
        operate1();
    }
}
/**
 * 分析继承和组合
 *
 * @author peter_wang
 * @create-time 2014-5-20 下午4:37:31
 */
public class CallClassDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SubCallClass subCallClass = new SubCallClass();
        subCallClass.operate1();
    }

}

组合类的使用

/**
 * 呼叫组合类
 *
 * @author peter_wang
 * @create-time 2014-5-20 下午5:11:34
 */
public class CombineCallClass {

    private SuperCallClass mSuperCallClass;

    public CombineCallClass() {
        mSuperCallClass = new SuperCallClass();
    }

    public void operate1() {
        System.out.println("operate in combine class");
    }

    /**
     * 只需要使用到SuperCallClass中的operate2方法
     */
    public void operate2() {
        mSuperCallClass.operate2();
    }

    public void call() {
        operate1();
    }
}

综上概述:

组合通常优于继承,

1.考虑使用多态,可以用继承。

2.考虑复用父类方法,而且父类很少改动,可以用继承。

其他情况请慎重使用继承。

java-组合优于继承,布布扣,bubuko.com

时间: 2024-10-11 04:00:21

java-组合优于继承的相关文章

Effective Java 第三版——18. 组合优于继承

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 18. 组合优于继承 继承是实现代码重用的有效方式,但并不总是最好的工具.使用不当,会导致脆弱的软件. 在包中使用继承是安全的,其中子类和父类的实现都在同一个程序员的控制之

组合优于继承

原文地址:http://leihuang.org/2014/11/18/composition-inheritance/ 为什么组合优于继承? 这是一个非常典型的设计模式的问题,Head First Design Pattern第一章好像就讲了,之前看得有点忘了.以下我把stackoverflow上面得分比較高的答案搬过来用一下,我认为这样更easy理解些. 两者差别 Think of composition as a has a relationship. A car "has an"

(转)组合优于继承---设计模式之策略模式

文章来源:http://www.javaeye.com/topic/328262 当我们掌握了Java的语法,当我们了解了面向对象的封装.继承.多态等特性,当我们可以用Swing.Servlet.JSP技术构建桌面以及Web应用,不意味着我们可以写出面向对象的程序,不意味着我们可以很好的实现代码复用,弹性维护,不意味着我们可以实现在维护.扩展基础上的代码复用.一把刀,可以使你制敌于无形而于江湖扬名,也可以只是一把利刃而使你切菜平静.Java,就是这把刀,它的威力取决于你使用的方式.当我们陷入无尽

JAVA学习笔记--组合与继承

JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率.这里主要介绍两种代码复用方式:组合和继承. 一.组合 组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成,因而称之为组合.这种方法只是复用了代码的功能,而不是它的形式. 1 public class Combine{ 2 public static void main(String[] args){ 3 /* 以下两行代码即体现了组合 */ 4 Combine1 com1 = new Combine1(

Java编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口.为取得此效果,需要在新类中嵌入一个现有类的private对象.但有时,允许类的用户直接访问新类中的组合成分是极具意义的,即将成员对象声明为public.如果成员对象自身都隐藏了具体实现,那么这种做法是安全的.当用户能够了

菜鸟译文(一)——Java中的继承和组合

阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和组合的概念.首先举一个继承的例子,然后展示一下如何用组合来改善继承的设计.最后概括一下如何在它们之间做出选择. 1. 继承 假设我们有一个Insect类.这个类包含两个方法:一个是move(),一个是attack(). class Insect { private int size; private

&lt;Java中的继承和组合之间的联系和区别&gt;

1 //Java中的继承和组合之间的联系和区别 2 //本例是继承 3 4 class Animal 5 { 6 private void beat() 7 { 8 System.out.println("心胀跳动..."); 9 } 10 public void breath() 11 { 12 beat(); 13 System.out.println("吸一口气,吐一口气,呼吸中..."); 14 } 15 } 16 //继承Animal,直接复用父类的bre

重新精读《Java 编程思想》系列之组合与继承

Java 复用代码的两种方式组合与继承. 组合 组合只需将对象引用置于新类中即可. 比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合. public class B { public void say(){ } } public class A { public void combo(){ B b = new B(); b.say(); } } 在 java编程思想中,还介绍了四种初始化引用的方式. 1.在定义对象的地方. public class Bath{ pr

组合与继承有什么区别

组合和继承是面向对象中两种代码复用的方式.组合是指在新类里面创建原有类的对象,重复利用已有类的功能.继承是面向对象的主要特性之一,它允许设计人员根据其它类的实现来定义一个类的实现.组合和继承都允许在新的类中设置子对象(subobject),只是组合是显式的,而继承则是隐式的.组合和继承存在着对应关系:组合中的整体类和继承中的子类对应,组合中的局部类和继承中的父类对应. 二者的区别在哪里呢?首先分析一个实例.Car表示汽车对象,Vehicle表示交通工具对象,Tire表示轮胎对象.三者的类关系下图