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

差别例如以下表所看到的

组合
继承
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. pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization

    本文内容:1. Xavier 初始化2. nn.init 中各种初始化函数3. He 初始化 torch.init https://pytorch.org/docs/stable/nn.html#to ...

  2. 前段开发 react native tab功能

    import React, { Component } from 'react'; import { StyleSheet, Text, View, Image, } from 'react-nati ...

  3. perl学习之:use and require

    本文和大家重点学习一下Perl use和require用法对比,这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序,区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域 ...

  4. InnoDB体系架构总结(一)

    缓冲池:    是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响.在数据库中读取的页数据会存放到缓冲池中,下次再读取相同页的时候,会首先判断该页是否在缓冲池中.对于数据库中页的修改操 ...

  5. win10和office2013激活

    1.去网上找kms,也可以在这下载————http://pan.baidu.com/s/1sjEAvwD————PS:找好对应的版本 2.首次运行时,只能点击激活windows VL和office 2 ...

  6. hdu3376 Matrix Again

    最大费用最大流 咋写?取个相反数就可以了-- #include <iostream> #include <cstring> #include <cstdio> #i ...

  7. python008 Python3 字符串

    var1 = 'Hello World!' var2 = "QQ603374730" Python 访问字符串中的值Python 不支持单字符类型,单字符也在Python也是作为一 ...

  8. 认识Linux文件系统的架构

    本文主要研究一下storm的OpaquePartitionedTridentSpoutExecutor TridentTopology.newStream storm-core-1.2.2-sourc ...

  9. POJ1201:Intervals【差分约束】

    题目大意:给出N个闭区间,每个区间给出一个ci值,让你找出最小的数集Z使得每个闭区间都有不少于ci个Z中的元素,求card(Z) 思路:06年集训队论文<浅析差分约束系统>有详细的解题,设 ...

  10. bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠 暴力

    [Usaco2007 Oct]Super Paintball超级弹珠 Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bess ...