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-组合优于继承的更多相关文章
- Effective Java 第三版——18. 组合优于继承
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Head First 设计模式--1策略模式 组合优于继承
策略模式:第一了算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户. 首先看个错误的面向对象. 假如我们需要写一个关于鸭子的程序,各种类型的鸭子.第一想到的就是建一个 ...
- Java组合与继承生成的类中构造函数的执行顺序
[程序实例] import java.util.*; class Meal{ Meal() { System.out.println("Meal Constructor"); } ...
- 组合优于继承 Composition over inheritance
https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance 解答1 Prefer composition ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)
1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...
- 菜鸟译文(一)——Java中的继承和组合
阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和 ...
- JAVA学习笔记--组合与继承
JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率.这里主要介绍两种代码复用方式:组合和继承. 一.组合 组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成, ...
- 重新精读《Java 编程思想》系列之组合与继承
Java 复用代码的两种方式组合与继承. 组合 组合只需将对象引用置于新类中即可. 比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合. public class B { ...
随机推荐
- HTML页面中5种超酷的伪类选择器:hover效果
想在自己的网站中应用超酷的hover效果吗?也许你可以从如下的这些实例中获得一些灵感,如果你喜欢这些效果,也可以直接拷贝代码并应用到你的站点. 给平淡的站点带来活力 hover效果能给网页增加一些动态 ...
- TWaver可视化编辑器的前世今生(三)Doodle编辑器
插播一则广告(长期有效)TWaver需要在武汉招JavaScript工程师若干要求:对前端技术(JavasScript.HTML.CSS),对可视化技术(Canvas.WebGL)有浓厚的兴趣基础不好 ...
- MySQL丨03丨基本语句
MySQL语句都是以 ; 号结尾的 看库(刘大婶直接面对的是各种档案袋) show databases; 建库(新弄了一个档案袋) create database database_name; 删库( ...
- POI导出,开发中经常会遇到数据导出这样的问题,下面是我在开发中采用的解决方法,大家可以参考,具体的实现害的结合你自身的业务逻辑
@RequestMapping(value = "/drawPayFailExport",method = RequestMethod.GET,produces = "a ...
- 学习vue之windows下安装live-server 超级详细篇
最近项目要求用vue2.0所以开始着手学习. 前期准备: 下载Node.js 地址:http://nodejs.cn/download/ 选择自己对应的版本,我下载的是.msi 64位的 然后就双击下 ...
- Uva 11212 编辑书稿(迭代加深搜索)
题意: 给定N个数的序列, 希望将它排列成1~N, 可以用剪切.粘贴来完成任务, 每次可以剪切一段连续的自然段, 粘贴时按照顺序粘贴. #include <bits/stdc++.h> # ...
- ms sql server 大批量导入
BULK INSERT 文章:BULK INSERT如何将大量数据高效地导入SQL Server 可以首先在数据库建一个表Temp_tb,这个表作为导入数据的表,然后使用bulk insert导入,导 ...
- HDU 3062 简单的2-SAT问题
在2-SAT,最让我纠结的还是添加有向线段的函数了 void add_clause(int i,int a,int j,int b){ int m=2*i+a; int n=2*j+b; ...
- [luoguP1360] [USACO07MAR]黄金阵容均衡Gold Balanced L…
传送门 真的骚的一个题,看了半天只会个前缀和+暴力.. 纯考思维.. 良心题解 #include <cstdio> #include <cstring> #include &l ...
- [luoguP1866]滑动窗口(单调队列)
传送门 可以搞2个单调队列. 然后,然后就没有然后了. # include <iostream> # include <cstdio> # include <cstrin ...