复用类

类的复用主要有以下的三种方式:组合、继承、代理

一、组合:

将现有类型作为新类型底层实现的一部分来复用。在新类中声明要复用的对象的引用。组合技术通常用于在新类中使用现有类的功能而非它的接口。”has-a”的关系

二、继承:

组合和继承都是在新的类中放置子对象,组合是显式的这样做,继承则是隐式的这样做。继承是使用现有类,为了某种特殊需要将其特殊化。“is-a”的关系.

三、代理:

继承和组合的中庸之道。将一个成员对象置于要构造的类中(就像组合),与此同时在新类中暴露了该类成员所有的方法(就像继承)。举例如下:

太空飞船控制模块

public class SpaceShipControls {void up(int velocity) {}void down(int velocity) {}void left(int velocity) {}void right(int velocity) {}void forward(int velocity) {}void back(int velocity) {}void turboBoost() {}} 

如果使用继承,假如SpaceShip继承控制模块(如下),但是SpaceShip并不是真正的SpaceShipControls的类型,显得不伦不类。即便它可以forward.

public class SpaceShip extends SpaceShipControls {private String name;public SpaceShip(String name) {this.name = name;}public String toString() {return name;}public static void main(String[] args) {SpaceShip protector = new SpaceShip("NSEA Protector");protector.forward(100);}}

太空船代理

public  class SpaceShipDelegation {private String name;private SpaceShipControls controls = new SpaceShipControls();public SpaceShipDelegation(String name) {this.name = name;}// Delegated methods:public void back(int velocity) {controls.back(velocity);}public void down(int velocity) {controls.down(velocity);}public void forward(int velocity) {controls.forward(velocity);}public void left(int velocity) {controls.left(velocity);}public void right(int velocity) {controls.right(velocity);}public void turboBoost() {controls.turboBoost();}public void up(int velocity) {controls.up(velocity);}public static void main(String[] args) {SpaceShipDelegation protector = new SpaceShipDelegation("NSEA Protector");protector.forward(100);}} 

四、结合使用组合和代理

class Plate {Plate(int i) {System.out.println("Plateconstructor");}}class DinnerPlate extends Plate {DinnerPlate(int i) {super(i);System.out.println("DinnerPlateconstructor");}}// 器具class Utensil {Utensil(int i) {System.out.println("Utensilconstructor");}}// 汤匙class Spoon extends Utensil {Spoon(int i) {super(i);System.out.println("Spoonconstructor");}}class Fork extends Utensil {Fork(int i) {super(i);System.out.println("Forkconstructor");}}class Knife extends Utensil {Knife(int i) {super(i);System.out.println("Knifeconstructor");}}// A cultural way of doingsomething:class Custom {Custom(int i) {System.out.println("Customconstructor");}}publicclass PlaceSetting extends Custom {private Spoon sp;private Fork frk;private Knife kn;private DinnerPlate pl;public PlaceSetting(int i) {super(i + 1);sp = new Spoon(i + 2);frk = new Fork(i + 3);kn = new Knife(i + 4);pl = new DinnerPlate(i + 5);System.out.println("PlaceSettingconstructor");}public static void main(String[] args) {PlaceSetting x = new PlaceSetting(9);}} /** Output: Customconstructor Utensil constructor Spoon constructor Utensil* constructor Forkconstructor Utensil constructor Knife constructor Plate* constructor DinnerPlateconstructor PlaceSetting constructor*/

五、在组合和继承之间选择

“is-a”的关系用继承,“has-a”的关系用组合。

class Vehicle {}class Engine {public void start() {}public void rev() {}public void stop() {}}class Wheel {public void inflate(int psi) {}}class Window {public void rollup() {}public void rolldown() {}}class Door{public Window window = new Window();public void open() {}public void close() {}}public class Car extends Vehicle {public Engine engine = new Engine();public Wheel[] wheel = new Wheel[4];public Doorleft = new Door(), right = new Door(); // 2-doorpublic Car() {for (int i = 0; i < 4; i++)wheel[i] = new Wheel();}public static void main(String[] args) {Car car = new Car();car.left.window.rollup();car.wheel[0].inflate(72);}}

java继承----类的复用相关推荐

  1. java 继承类 变量、静态变量、构造函数执行顺序

    java 继承类 变量.静态变量.构造函数执行顺序 Java代码   class C{ static int prt(int i){ System.out.println(i); return i; ...

  2. java 继承类_java类的继承

    继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(重写)的方式,产生一个新的类型.继承是面向对 象的三个基本特征--封装.继承.多态的其中之一,我们在使用java时编写的每一个类都是 ...

  3. JAVA继承类phone_JAVA(9)继承与多态

    继承与多态 .抽象类.接口 继承: 继承是类与类的一种关系 java中的继承是单继承 继承的好处: 子类拥有父类的所有属性和方法.(修饰符不能是private) 实现代码的复用 语法规则: class ...

  4. java继承类大全_Java 面向对象继承部分(示例代码)

    被继承的类称为父类(超类),继承父类的类称为子类(派生类) 通过继承可以实现代码重用 子类拥有父类非 private 的属性.方法. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. 子类可以 ...

  5. JAVA继承类phone_【Java基础】类-----继承

    一.基本知识 1.在Java语言中,实现类的继承使用extends关键字 格式如下: [public] class SubClass extends SuperClass{ //类体的定义 } 2.被 ...

  6. java继承类长方形面积_java_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法,本文实例讲述了java用接口、多 - phpStudy...

    java用接口.多态.继承.类计算三角形和矩形周长及面积的方法 本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** ...

  7. JAVA基础-java继承类实现

    定义人类Person.学生类Student.教师类Teacher.测试类Main 说明: 实现类的继承使用extends关键字,充分体现代码的可重用性 代码: Person类 public class ...

  8. Java学习记录-3.类的复用

    对类的复用主要有两种方式,组合与继承. 组合 在一个类中使用一个类. 对于这些对象的初始化有四种方式: 1.在定义域处,这样在构造器被调用之前就会被初始化. 2.在构造器内. 3.惰性初始化,既在使用 ...

  9. Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式

    一.继承的概念及用法       继承背后的思想就是        基于已存在的类来构建新类         当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...

最新文章

  1. Linux内核之内核同步(一)——内核同步基础
  2. 【采用】信贷业务风控逾期指标及风控模型评估指标
  3. 《鸿蒙理论知识04》HarmonyOS概述之系统定义
  4. 深入理解css优先级
  5. Docker是传统的应用发布管理的终结者么?
  6. java 基础第一季
  7. 合肥python招聘_2020年合肥京东方招聘官网招聘-合肥京东方招聘官网招聘求职信息-拉勾招聘...
  8. java通过JDBC驱动连接操作hive实例
  9. mysql left join右边有多条_left join 右表多条数据重复
  10. 时间序列数据如何插补缺失值?
  11. 英语-- such that
  12. Amine-PEG-Pyrene,芘丁酸聚乙二醇氨基,Pyrene-PEG-NH2
  13. android源生获取经纬度,Android获取GPS经纬度
  14. 如何设置苹果Mac菜单栏的时间与日期显示
  15. 机器自动翻译古文拼音 - 十大宋词 - 水调歌头 明月几时有 苏轼
  16. 三星mzvlb1t0hblr是什么固态_固态硬盘跑分速度天梯图/天梯表,最全搜集。
  17. 神经网络输入图片大小,神经网络 图像相似度
  18. 【初入前端】第三课 课前预习
  19. 假设银行一年整存零取的月息为1.875%(年息为12*1.875%,年息按复利计算),现在某人手头有一笔钱,他打算在今后5年中,每年年底取出1000元作为孩子来年的教育金,到第5年孩子毕业时刚好取完这
  20. ssm企业任务流程管理毕业设计-附源码221533

热门文章

  1. 最古老的100个.com域名
  2. Android TextView 初步学习
  3. 跨域解决方案(史上最易懂)
  4. webservice(二)简单实例
  5. 全球首条瓷绝缘子自动化生产线:黏土巧造“瓷器活”
  6. Centos 7下编译安装Apache
  7. 深入浅出理解c++虚函数
  8. dubbo 部分 配置的关系-dubbo github 官方案例
  9. 深度学习12大常见问题解答(附答案)
  10. Unity GUI(uGUI)使用心得与性能总结