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

差别例如以下表所看到的

组合
继承
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-组合优于继承的更多相关文章

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

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  2. Head First 设计模式--1策略模式 组合优于继承

    策略模式:第一了算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户. 首先看个错误的面向对象. 假如我们需要写一个关于鸭子的程序,各种类型的鸭子.第一想到的就是建一个 ...

  3. Java组合与继承生成的类中构造函数的执行顺序

    [程序实例] import java.util.*; class Meal{ Meal() { System.out.println("Meal Constructor"); } ...

  4. 组合优于继承 Composition over inheritance

    https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance 解答1 Prefer composition ...

  5. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  6. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

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

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

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

    阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和 ...

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

    JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率.这里主要介绍两种代码复用方式:组合和继承. 一.组合 组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成, ...

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

    Java 复用代码的两种方式组合与继承. 组合 组合只需将对象引用置于新类中即可. 比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合. public class B { ...

随机推荐

  1. HTML中pre标签的用法

    我们经常会在要保持文本格式的时候使用pre标签,比如当我们要展示源代码的时候,只要放一个pre标签,然后把源代码直接复制,粘贴,然后在页面上就可以保持好格式.不会像放在其它标签里那样,把换行和空格都自 ...

  2. vue 中scroll事件不触发问题

    在vue项目中需要监听滚动条滚动的位置,结果写了scroll监听事件就是不生效,最后查资料发现是页面有样式设置了over-flow:scroll,去掉之后完美解决.(页面样式中存在over-flow: ...

  3. svn搭建脚本

    1.yum install subversion 2.输入rpm -ql subversion查看安装位置 我们知道svn在bin目录下生成了几个二进制文件. 输入 svn --help可以查看svn ...

  4. Verdi:内存不足

    如果进行Verdi compile时,出现memory资源不够用.有可能case中出现了问题(或许发生了死循环,造成内存严重占用),此时尽量瘦身TC_FILE_LIST文件,缩小问题case的范围.

  5. Ubuntu16.04 搭建svn

    1.安装SVN 安装前先更新一下 sudo apt-get update 接下来安装 sudo apt-get install subversion 2.创建SVN版本库 1.创建home下的svn文 ...

  6. SSRS ( .rdl文件)如何动态的设置导出Excel文件中的工作表标签名

    要实现以上效果,则在Tablix属性里设置 参考:https://dotblogs.com.tw/ricochen/archive/2012/06/14/72798.aspx

  7. luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法

    BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...

  8. 命令行可以执行python脚本,jenkins里执行报错:cannot find Chrome binary

    “selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary”这个 ...

  9. 如何使用jmeter进行并发登录测试

    第一种方案直接从数据库中获取账号和密码 1.设置线程数为20 ,我们的并发用户量就是20个用户同时登录 2.添加定时器 3.设置集合点,当用户数量达到20个的时候再同时请求进行登录操作 4.添加配置元 ...

  10. ACDream:1210:Chinese Girls' Amusement【水题】

    Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Oth ...