重新精读《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);
    }
}

通过这种代理的方式,我们可以拥有更多的控制能力,可以选择提供再成员对象方法中的某个子集。

原文地址:https://www.cnblogs.com/jichi/p/12051979.html

时间: 2024-08-02 06:16:54

重新精读《Java 编程思想》系列之组合与继承的相关文章

1.JAVA 编程思想——对象入门

对象入门 欢迎转载,转载请标明出处:    http://blog.csdn.net/notbaron/article/details/51040219 如果学JAVA,没有读透<JAVA 编程思想>这本书,实在不好意思和别人说自己学过JAVA.鉴于此,蛤蟆忙里偷闲,偷偷翻看这本传说中的牛书. 面向对象编程OOP具有多方面吸引力.实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.已于维护的设计方案. 这些描述看上去非常吸引人的,不过蛤蟆还是没啥印象(至少到

java编程思想总结(三)

java编程思想总结(三) java编程思想总结是一个持续更新的系列,是本人对自己多年工作中使用到java的一个经验性总结,也是温故而知新吧,因为很多基础的东西过了这么多年,平时工作中用不到也会遗忘掉,所以看看书,上上网,查查资料,也算是记录下自己的笔记吧,过一段时间之后再来看看也是蛮不错的,也希望能帮助到正在学习的人们,本系列将要总结一下几点: 面向对象的编程思想 java的基本语法 一些有趣的框架解析 实战项目的整体思路 代码的优化以及性能调优的几种方案 整体项目的规划和视角 其它遗漏的东西

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

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

Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面 试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关系和has-a关系的区别),也有深入的涉及RTTI和JVM底层 反编译知识. 1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意

Java编程思想(20170818)

继承和组合是java中非常常用的两种创建新类型的方法,两者都能提高代码的复用率. 继承主要是想让子类继承父类的基本特性:组合技术通常用于想在新类中使用现有类的功能,而非它的接口.两者的分别是"IS A"和"HAS A"的关系 继承: class Shape { public void draw() { System.out.println("draw a shape"); } public void erase() { System.out.pr

【java编程思想--学习笔记(四)】对象导论

写这篇博客的前言: 长话短说,我希望通过阅读<java编程思想>来使我的代码 简洁可用 . 目的的层次不同,首先具体的目标是,了解Java的特性和巩固Java的基础. 更抽象的目的如下: 1.期待以巩固基础的方式,使代码优美,简洁,高效. 2.使自己写的模块能够开放适度,好用. 3.形成一种对代码是否优美的审美观. 于是<Java编程思想>第一章 对象导论 由此开始. 1.1 抽象过程 java 相对于命令式语言的优势在于只针对于待解问题建模.后者所做的主要抽象要求所做问题基于计算

java编程思想-基础

interface: 方法默认为public:成员变量默认 static and final 对象数组的定义:理解? 多接口继承:可以多个接口,但只有一个具体类,具体类在前面 自:多接口继承时,来自不同接口的同名方法怎么处理呢? java重载不能依靠返回类型加以区分(C++可以),也不能依靠checked 异常类型区分 变量定义中的系列定义(逗号隔开):变量名 = 值,其它公共 自:类中,自己引用自己的理解(如,链表节点元素).静态看成动态,编译器的本质实现 内部类和普通类区别:内部类可priv

66.JAVA编程思想——网络编程

66.JAVA编程思想--网络编程 历史上的网络编程都倾向于困难.复杂,而且极易出错. 程序员必须掌握与网络有关的大量细节,有时甚至要对硬件有深刻的认识.一般地,我们需要理解连网协议中不同的"层"(Layer).而且对于每个连网库,一般都包含了数量众多的函数,分别涉及信息块的连接.打包和拆包:这些块的来回运输:以及握手等等.这是一项令人痛苦的工作.但是,连网本身的概念并不是很难.我们想获得位于其他地方某台机器上的信息,并把它们移到这儿:或者相反.这与读写文件非常相似,只是文件存在于远程

Java编程思想(四) —— 复用类

看了老罗罗升阳的专访,情不自禁地佩服,很年轻,我之前以为和罗永浩一个级别的年龄,也是见过的不是初高中编程的一位大牛之一,专访之后,发现老罗也是一步一个脚印的人.别说什么难做,做不了,你根本就没去尝试,也没有去坚持. If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but whatever you do,you have to keep moving forward--Martin