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 编程思想》系列之组合与继承的更多相关文章

  1. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

  2. 《Java编程思想》阅读笔记一

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)第四版进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会 ...

  3. 《Java编程思想》读书笔记(三)

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...

  4. 《Java编程思想》读书笔记(五)

    前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...

  5. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  6. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

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

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

  8. java编程思想

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...

  9. Java编程思想(11~17)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...

随机推荐

  1. MATLAB相机标定转XMl代码

    function writeXML(cameraParams,file) %writeXML(cameraParams,file) %功能:将相机校正的参数保存为xml文件 %输入: %cameraP ...

  2. [UWP]用Win2D和CompositionAPI实现文字的发光效果,并制作动画

    1. 成果 献祭了周末的晚上,成功召唤出了上面的番茄钟.正当我在感慨"不愧是Shadow大人,这难道就是传说中的五彩斑斓的黑?" "那才不是什么阴影效果,那是发光效果.& ...

  3. K8s & Openshift案例学习

    1. openshift排错技巧:https://mp.weixin.qq.com/s?__biz=MzAwMDc2NjQ4Nw==&mid=2663494178&idx=1& ...

  4. IDEA导入MySQL的jdbc驱动,并操作数据库

    将MySQL的jdbc驱动,导入IDEA的方式,虽然也能连接并且操作数据库,但并不推荐这种方式,推荐使用Maven工程的方式:https://www.cnblogs.com/dadian/p/1193 ...

  5. Java 9 ← 2017,2019 Java → 13 ,都发生了什么?

    距离 2019 年结束,只剩下 35 天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天, 的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋友圈 ...

  6. 【Luogu P1981】表达式求值

    点我进入原题Luogu P1981 [解题思路] 仔细分析题目,这就是一道模拟题…… 直接按照符号读入全部的数字,先算乘法,最后把全部数加起来就是结果了 记得要%10000取最后四位 [参考程序] # ...

  7. day20191120笔记

    1.spring的优势 U盘拷.总结.微信公众号:.2.笔试,课前默写,默完之后要回答问题.3.微服务,带着,知识点,卷子.ssm整个东西讲一下.面试是综合能力.背面试题. 通过基础很重要.学精烂熟于 ...

  8. 网站出现bug,我深夜被叫醒处理,用一个触发器解决了问题

    凌晨两点,我正在睡梦之中,此时电话忽然想起,在漆黑的深夜中显得格外刺耳. 这个时间点电话响了肯定没好事,因为我的手机在夜间模式下,除非被同一个电话号码打三次,否则是静音,因此电话那边的人肯定有急事找我 ...

  9. 堡垒机WebSSH进阶之实时监控和强制下线

    这个功能我可以不用,但你不能没有 前几篇文章实现了对物理机.虚拟机以及Kubernetes中Pod的WebSSH操作,可以方便的在web端对系统进行管理,同时也支持对所有操作进行全程录像,以方便后续的 ...

  10. pod install/update速度慢或失败的解决方案实践

    本文基于 https://www.cnblogs.com/dabaomo/p/9634727.html 声明 坚决拥护党的领导,本文章所用技术乃出于工作需要,敬请谅解. 正文 可以先过去快速浏览一遍再 ...