1. 组合语法

    将对象引用置于新类中。

  2. 继承语法

    衍生类自动获得基类中所有的域和方法

    super关键字表示基类。

    1. 初始化基类

      当创建一个衍生类的对象时,该对象创建一个基类的子对象并包含子对象。

      衍生类实例化时,首先实例化基类,然后在实例化衍生类。

      Java 会自动在衍生类的构造器中插入对基类默认构造器的调用。

      如果基类没有默认构造器,则必须在衍生类构造器中指定基类可用的构造器来初始化基类。

      基类在衍生类构造器可以访问它之前,就必须完成初始化。

  3. 代理

    第三种关系称为代理,Java并没有提供对它的直接支持。这是继承与组合之间的中庸之道,因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。

    例如,太空船需要一个控制模块,构造太空船的一种方式时使用继承(太空船SpaceShip继承控制模块SpaceShipControls)。然而,SpaceShip并非真正的SpaceShipControls类型,更准确地讲,SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中都暴露了出来。

    代理解决了此难题:

      Class :SpaceShipControls

package lime.thinkingInJava._007003;

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(int velocity){}
}

      Class : SpaceShipDelegation

package lime.thinkingInJava._007003;

public class SpaceShipDelegation {
private String name;
private SpaceShipControls controls = new SpaceShipControls(); public SpaceShipDelegation(String name) {
this.name = name;
} 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(int velocity){
controls.turboBoost(velocity);
}
public void up(int velocity){
controls.up(velocity);
}
public static void main(String[] args){
SpaceShipDelegation protector = new SpaceShipDelegation("Lime Protector");
protector.forward(100);
}
}

    可以看到,上面的方法是如何传递给了底层的controls对象,而其接口由此也与使用继承得到的接口相同了。但是,我们使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集,或在调用底层的controls对象的方法时执行其他逻辑。如:

    public void forward(int velocity){
System.out.println("执行其他逻辑。。。");
controls.forward(velocity);
System.out.println("执行其他逻辑。。。");
}

  4. 结合使用组合和继承

    1. 确保正确清理

    2. 名称屏蔽

  5. 在组合与继承之间选择

  6. protected关键字

  7. 向上转型

    1. 为什么称为向上转型

    2. 再论组合与继承

  8. final关键字

    1. final数据

      1.final参数

    2. final方法

      1. finali和private关键字

    3. final类

    4. 有关final的忠告

  9. 初始化及类的加载

    1. 继承与初始化

  啦啦啦

ThinkingInJava 学习 之 0000006 复用类的更多相关文章

  1. thinkinginjava学习笔记06_复用类

    MarsEdit粘代码好麻烦,所有代码交给github:https://github.com/lozybean/MyJavaLearning 复用一个类常用的两种方式:组合.继承: 组合 将对象引用置 ...

  2. Java编程思想学习(五) 复用类

    1.继承与组合 复用类的方法有两种:继承与组合.继承就不多说了,组合就是直接在类中new一个对象. 数组也是对象,使用数组也是组合的一种. 2.初始化基类 当创建一个导出类的对象时,该对象包含一个基类 ...

  3. [THINKING IN JAVA]复用类

    7 复用类 7.1 组合 即在一个类中使用另一个类作为成员变量,这是复用了现有程序代码的功能,而非形式. 7.2 继承 关键字:extends,这种复用是形式的复用,是一种可扩展和限制的复用: 复用: ...

  4. java编程思想-复用类总结

    今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...

  5. 【Thinking in java, 4e】复用类

    mark一篇09年的<Thinking in Java>笔记:here --> https://lawrence-zxc.github.io/2009/11/07/thinking- ...

  6. Java基础—复用类

    复用代码是Java众多引人注目的功能之一. 一般而言,实现代码重用java提供了两种方式:组合以及继承. 组合:新的类由现有类的对象所组成.(复用现有代码的功能,而非它的形式) 继承:按照现有类的类型 ...

  7. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  8. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

  9. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

随机推荐

  1. C#6.0特性与vs2015

    C#6.0 中的那些新特性 1. 自动属性的初始化 public string Name { get; set; } = "zhangsan"; 2. 只读属性初始化 public ...

  2. 使用gulp对js、css、img进行合并压缩

    1 概述 最新使用AngularJS框架做单页面项目,其中包括了很多库的和自已写的js.css.img文件,这些文件都不大,但是数量众多,导致web请求文件过多,一次性加载时比较慢.有尝试过使用异步加 ...

  3. chrome插件开发.在content_script异步加载页面后, 如何进行JS通信与调用的问题

    使用场景 在开发Chrome插件时, 有一种需求: 要求在WEB页面显示一个浮动窗口(A), 在此窗口中允许用Ajax方式调用另一个服务器上的一个页面(B) B页面上有独立的功能用JS写functio ...

  4. Maven学习总结(11)——Maven Tomcat7自动部署

    1.配置tomcat-users.xml文件 在tomcat安装目录下找到tomcat-users.xml文件.该文件路径为[tomcat安装根目录]/conf/ 修改文件内容,增加下列内容: < ...

  5. 监控命令之tsar

    1.1 tsar是什么? tsar是淘宝自己开发的一个采集工具(类似于sar工具),主要用来收集服务器的系统信息(如cpu,io,mem,tcp等),以及应用数据(如squid haproxy ngi ...

  6. sed 多行处理详细总结

    在正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一条接着一条的对该行进行处理,直到脚本执行完毕,然后该行被输出,模式空间请空:然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完备. ...

  7. :app:compileDebugJavaWithJavac

    org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: ...

  8. 【转】一次SpringMVC+ Mybatis 配置多数据源经历

    需求 现在在维护的是学校的一款信息服务APP的后台,最近要开发一些新功能,其中一个就是加入学校电影院的在线购票.在线购票实际上已经有一套系统了,但是是外包给别人开发的,我们拿不到代码只能拿到数据库,并 ...

  9. ios实例开发精品源码文章推荐(8.22)

    1.iOS源码:简单阅读器 http://www.apkbus.com/android-112176-1-1.html 2.iOS源码:音频声效--Audio Streamer<ignore_j ...

  10. Linux系统如何将某一程序设置为开机自启动

    文章来源:百度知道. Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍L ...