`
modabobo
  • 浏览: 508139 次
文章分类
社区版块
存档分类
最新评论

java 复用代码(组合与继承)

 
阅读更多

java中的类都是围绕着类进行的。可以通过创建新类来复用代码,而不必从头编写。可以使用别人已经开发并调试好的类。此方法使用的窍门在于使用类而不破坏现有的程序代码。达到这一目的的方法有两种。第一种方法非常直观:在新类中创建现有类的对象,通过现有类的对象调用其中的成员,来达到复用代码的目的。由于新类是由现有类的对象所组成的,所以这种方式称为组合。该方式只是复用了现有程序的代码,而并非它的形式。

第二种方法则更细致一些,它按照现有类的类型来创建新类。在新类中无需改变现自己的形式,而是采用现有类的形式并在其中添加代码。这种神奇的方式称为继承,而且编译器可以完成大部分工作。继承是面向对象程序设计的基石之一。

组合和继承之间的选择

组合和继承都也许在新类中放置子对象,组合是显示的这样做,而继承则是隐式的这样做。二者之间的区别何在,以及怎样选择呢?

组合技术通常用于想在新类中使用现有类的功能而非它的接口的形式。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类用户看到的只是为新类所定义的接口,而非嵌入对象的接口。为取得此效果,需要在新类中嵌入一个现有类的private对象。

有时,也许类的用户直接访问类的组成部分是极具意义的;也就是说,将成员对象声明为public。如果成员对象自身都隐藏了具体的实现,那么这样做是安全的。当用户能够了解到你正在组装一组部件时,会使得端口更加易于理解。car对象即为一个很好的例子:

上面的例子只是我们分析问题的一部分,不是具体的底层实现,所以我们使Car中的成员声明为public,这将有助于客户端程序员了解怎样去使用类,而且也降低了类开发者所面临的代码复杂度。但务必要记住,这仅仅只是一个特例,一般情况下应该使域成为private。

在继承的时候,使用某个现有类,并开发出它的一个特殊版本。通常,这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。略微思考一下就会发现,用一个"交通工具"对象去构成一部"车子"是毫无意义的,因为"车子"不包括"交通工具","车子"仅仅是"交通工具"的一种(is-a)。is-a(是一个)用来表示继承关系,而has-a(有一个)用来表示组合关系。

在面向对象中编程中,生成和使用程序代码最有可能采用的方法就是直接将数据和方法包装进一个类中,并使用该类的对像。也可以使用组合技术使用现有类来开发新的类。而继承技术其实是不太常用的。尽管我们在学习OOP的过程中多次强调继承,但这不意味着要尽可能的使用它。相反,应当谨慎使用这一技术,使其使用场合仅限于你确信该使用这一技术的情况下。那到底该使用组合还是继承?一个最清晰的判断方法就是问一问你自己是否要从新类型向基类向上转型。需要的话继承则是必须的,如果不需那应当好好考虑是否使用继承。

分享到:
评论

相关推荐

    Java编程复用类代码详解

    主要介绍了Java编程复用类代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    简单谈谈javascript代码复用模式

    代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承。在javascript中,并没有类的概念,所以代码的复用,也并不局限于类式继承。javascript中创建对象的方法很多,有构造函数,可以使用new创建...

    thinkinjava源码-Think-In-Java-Code:ThinkingInJava(第四版)书中源码以及课后练习代码

    think in java 源码 Think-In-Java-Code Thinking In Java 书中源码以及课后练习代码(从第7章开始随着看书的进度一步步更新) ...继承与初始化 第八章 多态 8.1 再论向上转型 8.2 转机 8.2.2 产生正确的行为

    java三大特性说明

    继承的目的: 实现代码的复用.理顺类型对象之间的结构关系. 构建一个父类的时候,要求他的子类与父类必须有理论上的确实的继承关系 代码复用的方法:  继承复用,完全的将父类非私有部分作为子类的内容,若需变化...

    【java编程思想第五版笔记】第八章复用(更新中)

    【java编程思想第五版笔记】第八章复用(更新中)面向过程和面向对象复用的区别:组合的语法关于上面的程序的解析初始化引用有四种方法:继承语法 更新自2020.04.22 代码复⽤是⾯向对象编程(OOP)最具魅⼒的原因之⼀...

    疯狂JAVA讲义

    5.8 继承与组合 154 5.8.1 使用继承的注意点 155 5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    承也实现了代码的复用,使程序的复杂性线性地增长,而不是呈几何级数增长。 2.2.6 抽象 面向对象的程序设计系统鼓励充分利用"抽象"。在现实世界中,人们正是通过抽象来 理解复杂的事务。例如:人们并没有把...

    java 面试题 总结

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...

    超级有影响力霸气的Java面试题大全文档

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符...

    酒店管理系统源码下载java-pattern:设计模式代码

    优先使用对象组合而不是继承 设计模式在软件开发中的两个主要途径: 1.开发人员的共同平台: 设计模式提供了一个标准的术语系统,且具体到特定的情景。例如,单例设计模式意味着使用单个对象,这样所有熟悉单例设计...

    安卓java读取网页源码-JavaPattern:Java设计模式

    适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式(对象与对象在干嘛): – 模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式...

    java餐饮管理系统源码-pattern:设计模式扫盲,以身边故事来讲解设计模式

    java餐饮管理系统源码 设计模式 代码实践 TODO LIST UML图解 软件设计七大原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特法则 6.里氏替换原则 7.合成复用原则 创建型 单例模式 工厂模式 ...

    重构-改善既有代码的设计(中文版)

     Implications Regarding Software Reuse and Technology Transfer 对软件复用与技术传播的意义   A Final Note 结语   References 参考文献  Chapter 14:Refactoring Tools(by Don Roberts and John Brant) ...

    【04-面向对象(上)】

    •利用组合实现复用:总之,继承要表达的是一种“是(is-a)”的关系,而组合表达的是”有(has-a)“的关系。 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ ...

    软件工程完整ppt

     145UML类图与Java代码的转换  1451UML类图—Java代码的生成  1452Java代码的逆向工程  146习题  第15章面向对象的软件体系结构  151软件体系结构概述  152流程处理与客户机/服务器体系结构  1521流程处理 ...

    二十三种设计模式【PDF版】

    使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用...

    设计模式Demo

    LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键...

    Grails 中文参考手册

    4.2 可复用的Grails脚本 4.3 脚本中的事件 4.4 Ant和Maven 5. 对象关系映射(GORM) 5.1 快速指南 5.1.1 基本的CRUD 5.2 在GORM中进行领域建模 5.2.1 GORM中的关联 5.2.1.1 一对一 5.2.1.2 一对多 5.2.1.3 多对多 ...

    敏捷软件开发:原则、模式与实践.pdf

    第14章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第15章 FACADE模式和MEDIATOR模式 第16章 SINGLETON模式和MONOSTATE模式 第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付...

Global site tag (gtag.js) - Google Analytics