重新精读《Java 编程思想》系列之组合与继承
Java 复用代码的两种方式组合与继承。
组合
组合只需将对象引用置于新类中即可。
比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合。
public class B {
public void say(){
}
}
public class A {
public void combo(){
B b = new B();
b.say();
}
}
在 java编程思想中,还介绍了四种初始化引用的方式。
1、在定义对象的地方。
public class Bath{
private String s1 = "happy";
public Bath(){};
}
2、在构造器中
public class Bath{
private String s1;
public Bath(){
s1="happy";
};
}
3、在使用对象的时候,进行初始化,也叫惰性初始化。这种方式可以减少额外的负担。
class Lazy{
}
public class Bath{
private Lazy lazy;
public Bath(){
};
public void initLazy(){
lazy = new Lazy();
}
}
这样当只有调用Bath的initLazy方法的时候,Lazy对象才会被初始化,不调用的时候,不会被初始化。
4、使用实例初始化。
这种最简单了,我们经常使用的实例初始化就是这样的。
public class Bath{
public static void main(String args){
Bath bath = new Bath();
}
}
继承
当我们创建一个类的时候,无时无刻不在继承,如果我们没有明确的指出继承哪个类,隐式的继承 Object 类。
继承使用的extends关键字,子类会继承父类的所有成员变量和方法。
继承的一个大原则就是,我们将所有的数据成员置为private,将方法设置为public。这样可以便于其他类访问被继承类的所有方法。
Java 使用 super关键字来调用父类的构造方法。
在子类继承父类的时候,会自动调用父类的构造函数,如果都是无参的构造函数,则不需要显示调用,如果是有参的构造函数,子类继承的时候就需要显示的用super调用。
class Art {
Art(){
System.out.println("art");
};
}
class Drawing extends Art{
Drawing(){
System.out.println("Drawing");
}
}
public class Cartoon extends Drawing{
Cartoon(){
System.out.println("cartoon");
}
public static void main(String[] args) {
Cartoon cartoon = new Cartoon();
}
}
结果如下:

如果我们的构造函数是有参的。子类继承,不调用则会提示。

我们必须使用super显示的调用
class Art {
Art(String s){
System.out.println("art");
};
}
class Drawing extends Art{
Drawing(){
super("a");
System.out.println("Drawing");
}
}
书中这里有一道练习题,证明基类构造器,a、总是会被调用,b、在导出类构造器之前被调用。
上面的例子,同时证明了两点。子类构造器的代码总是最后执行的。然后父类构造器中的打印代码会打在控制台上。
代理
在书中还介绍了一个概念代理,说是代理也是复用的一种形式。那么这个怎么理解呢。
书中的例子举的是十分好的。
比如我们有一个太空船的控制模块。这里简略我们只写一个想上飞和向下飞的代码。
public class SpaceShipControls{
void up(int a){};
void down(int a){};
}
我们再建立一个太空飞船,飞船肯定是可以向上飞和向下飞的。所以我们第一种方案采用继承的方式。直接调用控制器的代码。
public class SpaceShip extends SpaceShipControls{
public static void main(String[] args){
SpaceShipControls s = new SpaceShipControls();
s.up(100);
}
}
目前来看控制器的所有方法,我们太空飞船都有了。从某种意义上说 太空飞船成为了太空控制器。事实不应该这样的,应该是太空飞船向太空控制器发送指令。
我们使用代理的方式,来创建这段代码,再来看下。
public class SpaceShipDelegation{
private SpaceShipControls s = new SpaceShipControls();
public void up(int a){
s.up(a);
}
public void down(int a){
s.down(a);
}
public static void main(String args){
SpaceShipDelegation sa = new SpaceShipDelegation();
sa.up(100);
}
}
通过这种代理的方式,我们可以拥有更多的控制能力,可以选择提供再成员对象方法中的某个子集。
重新精读《Java 编程思想》系列之组合与继承的更多相关文章
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
- 《Java编程思想》阅读笔记一
Java编程思想 这是一个通过对<Java编程思想>(Think in java)第四版进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会 ...
- 《Java编程思想》读书笔记(三)
前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...
- 《Java编程思想》读书笔记(五)
前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- java编程思想-复用类总结
今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
- Java编程思想(11~17)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...
随机推荐
- Win32 COM组件 x Android Service
有些书在介绍和讲解android的Service组件时,会使用后台服务一词,并且与运行在主线程的Activity相对.因为后台一词很容易误解,服务一直运行在后台?什么线程在运行?服务一直有条线程在运行 ...
- drf序列化组件之视图家族
一.视图家族的分类 1.导入分类 from rest_framewok import views, generics, mixins, viewsets views:视图类 两大视图类:APIVi ...
- 你真的会用JavaScript中的sort方法吗
在平时的业务开发中,数组(Array) 是我们经常用到的数据类型,那么对数组的排序也很常见,除去使用循环遍历数组的方法来排列数据,使用JS数组中原生的方法 sort 来排列(没错,比较崇尚JS原生 ...
- 使用shiro做权限管理的学习笔记整理
Shiro权限管理 参考:https://www.cnblogs.com/jpfss/p/8352031.html Shiro解决的问题 授权和鉴别的问题:Authenrization(授权) Aut ...
- java多线程,多线程加锁以及Condition类的使用
看了网上非常多的运行代码,很多都是重复的再说一件事,可能对于java老鸟来说,理解java的多线程是非常容易的事情,但是对于我这样的菜鸟来说,这个实在有点难,可能是我太菜了,网上重复的陈述对于我理解这 ...
- 玩转网络(一)用TTL(Time To Live)排查网络问题
先大概介绍一下TTL(Time To Live)吧! TTL翻译过来就是网络生存时间,说的是一个网络数据包,它在网络设备中转发的跳数(网络设备这里一般指的是路由器),默认值为64,也有很多设置为了12 ...
- 微信公众号配置及微信jsAPI支付
公众号配置 一.基本配置 首先登陆微信公众平台,在开发--->配置--->公众号开发信息,获取到AppId,开发者秘钥是后台需要的,给到后台,IP白名单配置就是你服务器的IP地址写到里面就 ...
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等)
python3 解释器默认编码为Unicode,由str类型进行表示.二进制数据使用byte类型表示. 字符串通过编码转换成字节串,字节码通过解码成为字符串. encode:str-->byte ...
- 2019-9-26:渗透测试,基础学习,js正则以及什么是目录扫描,笔记
js正则表达式,用单个字符串描述或者匹配符合特定语句规则的字符串,相当于一种搜索模式.一些字符序列组合在一起,可以简单也可以复杂模式的,可以去搜索还可以替换 正则表达式语法/表达式/修饰符(可选),例 ...
- C#Windows Forms窗体、按钮-xdd
1.更换窗体图标 方法:单击窗体,更改icon属性. 2.调整窗体打开时默认位置 方法:单击窗体,更改StartPotion属性. 3.修改窗体大小 方法:单击窗体,更改Size属性. 4.设置窗体的 ...