MarsEdit粘代码好麻烦,所有代码交给github:https://github.com/lozybean/MyJavaLearning

复用一个类常用的两种方式:组合、继承;

组合

将对象引用置于新类中,新类就完成了这些对象的复用;

Java中,每个非基本对象都有一个toString方法,当需要一个String对象时直接调用;对象的引用在类的定义中会被初始化为null;引用初始化可以在四个地方进行:对象定义时 > 实例初始化 > 类构造器中  > 使用对象之前(按初始化顺序排列);示例代码

继承

使用extends关键字继承一个类的成员(除private之外);

示例代码中,可以看到main方法可以存在于多个类中,这样的写法为了单元测试更加简便易行(翘首以待),即便Cleanser并不是public类,但是public main()仍然可以被外部调用;即:即使一个类只具有包访问权限,其public main()仍然是可访问的;

Detergent类使用extends继承了Cleanser,即实现了Cleanser中所有可继承方法的复用;不仅如此,还可以在Detergent类中对某些方法进行改写,如scrub()方法,在改写过程中,如果需要调用基类的同名方法,则使用super.scrub()来调用;当然,Detergent类可以定义除了继承来的方法之外的方法;

在子类创建对象之前,会先进行基类的初始化;也就是说,当创建了一个子类的对象时,不仅仅复制了基类的接口,会包含一个基类的子对象,该子对象包装在子类的对象内部,并具有直接使用基类创建的对象一样的属性;如:示例代码中,在Cartoon类构造器可以访问到对象之前,基类的构造器就可以访问到,并且完成初始化;即使没有Cartoon构造器,编译器也会产生一个默认的构造器,并且调用基类的构造器;并且可以看到,当C类继承A类,并且有一个B类的对象时,如果实例化C类对象,则会先调用A类的构造器,再调用B类构造器,最后调用自身构造器(如果没有定义的话,则不会调用);

当基类中的构造器不是默认构造器,而是带参数的构造器,并且没有默认构造器时,则必须在子类中使用super(args)调用该构造器,并传入相应的参数列表,否则无法完成基类的构造,编译器报错;示例代码

子类中的构造器执行顺序为:包含其他类对象的构造器(当该对象是直接初始化时,如果在构造器中初始化,则和子类构造器一个顺序级别)、基类构造器、子类构造器;若前两者没有默认的构造器,则包含其他类对象必须正确调用构造器,基类必须使用super(args)正确调用构造器;示例代码

继承过程的初始化过程为:1. 加载基类、基类的static初始化;2. 如果加载基类的过程中,发现还有基类,则先加载该基类,执行static初始化,然后再回到第一个基类中的static初始化过程,依次类推;3. 基类加载完成后创建对象,调用基类构造器(生成隐含子对象),然后再调用子类构造器,完成对象创建;如示例代码中,执行Beetle.main()时,先加载Beetle类,发现有一个基类Insect,并加载该基类,以及其static成员的初始化,然后完成Beetle类的static初始化,接着才是顺序执行println语句,之后新建一个Beetle对象,先进行基类的数据成员加载,然后调用基类的构造函数,接着进行子类的数据成员加载,最后调用子类的构造函数;只有这样的过程,才能保证子类所依赖的基类成员被正确初始化;

代理

java并没有提供代理的直接支持,将一个成员对象置于所要构造的类中,但同时又在新类中暴露该成员对象的所有方法;即在新类中添加一个想要继承类的对象,然后在新类中实现该对象的方法,此时,使用该代理创建的对象便可通过实现的方法拥有和继承类相同的接口;不同的是,代理可以选择继承方法中的某个子集,所以具有更加灵活的控制力;示例代码

清理

java中,析构函数可以在对象被销毁时自动调用(finalize()方法),当需要在一个类的生命周期内执行一些必须的清理活动,除了finalize()方法外,并不能知道java在何时销毁一个对象,但是将该方法置于finally子句中,可以保证该方法被调用(无论是正常执行还是异常退出);即:

try{
    // … do something
} finally{
    x.dispose(); //这里是自己实现的清理方法,该方法一定会被执行;
}

在实现清理方法时,必须注意基类和成员对象清理方法的调用顺序,防止某个子对象依赖于某个子对象的情形发生;(一般来说,按照构造器调用的相反顺序),如:示例代码

覆盖

在java中重载某个基类的方法时,并不需要(如C++中)将该方法屏蔽,而可以使用基类中的所有重载方法;如:示例代码中,Bart重载了方法doh,并使用了新的参数列表,但是Bart类实例化的对象仍然可以调用Homer中的同名方法;

这样的特性有时会引起迷惑,所以Java SE5新增加了@Override注释(并不是关键字),当给某个方法添加该注释后,如果子类直接调用该方法则会产生错误,必须重载该方法才能正确使用;(突然明白swift ios开发学习时用到的各种override)

选择

组合和继承虽然都可以复用对象,组合是显式地将子对象放到新类中,而继承是隐式地将子对象放到新类中;

组合常用于想在新类中实现现有类的功能,而非它的接口这种情形,即,在新类中嵌入某个对象,让该对象来实现需要的功能,由于新类的用户想要看到的是新类的接口,而非嵌入对象的接口,所以需要用private来嵌入该对象;但有时,允许新类中的组合成分可见是很有意义的,此时应该使用public来嵌入该对象;

继承常用于要使用某个现有的类,并开发它的一个特殊版本;继承可以获得基类中的protected域,这是组合和代理所无法完成的;继承更加重要的方面是表现:新类是现有类的一种类型(书上翻译的名词,感觉容易混肴,这里的类型不是编程语言中的术语,而是自然语言中的类型),通过继承可以实现向上转型,即在导论中提到的例子,一个基类的方法可以直接处理子类,这样做的好处是将方法通用化,实现特殊化;如果设计上没有明确要求向上转型的操作,则应该慎重考虑使用继承,而常用组合;

而代理则是使用组合实现子对象的功能时,添加相应的接口方法,是对基类的某部分进行重新实现;

final关键字

final关键字指无法改变的;

当final用于数据时,表示该数据是一个常量,或者在运行时被初始化的值,但是不希望被改变;习惯上,将既是static又是final的域用大写表示,并使用下划线来分割每个单词;java允许生成空白final,即在指定final时并未直接初始化,但是空白final必须确保在使用前初始化;

当final用于参数时,表示在方法中无法更改该参数引用的对象;

当final用于方法时,表示该方法别锁定,不能在继承中重载;类中所有的private方法都隐式地被添加final关键词;

当final用于类时,表示该类不可被继承;

thinkinginjava学习笔记06_复用类的更多相关文章

  1. ThinkingInJava 学习 之 0000006 复用类

    1. 组合语法 将对象引用置于新类中. 2. 继承语法 衍生类自动获得基类中所有的域和方法 super关键字表示基类. 1. 初始化基类 当创建一个衍生类的对象时,该对象创建一个基类的子对象并包含子对 ...

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

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

  3. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  4. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

    Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...

  6. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  7. Java学习笔记16---抽象类与接口的浅显理解

    抽象类是由abstract修饰的类,定义方式如public abstract class A{...}. 接口由interface修饰,定义方式如public interface B{...}. 抽象 ...

  8. java学习笔记7--抽象类与抽象方法

    接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...

  9. thinkinginjava学习笔记04_初始化与清理

    java沿用了c++的构造器,使用一个和类名完全一样的方法作为类的构造器,可以有多个构造器来通过不同的参数进行构造,称为重载:不仅是构造器可以重载,其他方法也一样通过不同的形参以及不同的返回值来实现重 ...

随机推荐

  1. [CSS 混合模式]——mix-blend-mode/background-blend-mode简介

    mix-blend-mode/background-blend-mode CSS3真是有很多的神奇的地方,这个两个元素你知道吗? 这是张大大拿过来的图,关于混合模式,借图一用. mix-blend-m ...

  2. tyvj4877 组合数

    1.组合数 (zero.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合:从m个不 ...

  3. selenium webdriver使用click一直失效问题的几种解决方法

    想要爬取动态网页,很莫名的click失效.被这个问题困扰了很久,基本上把网上提到的所有方法试遍了,最终终于有个方法成功了,在这里总结一下. 这是我想要点击的网页,初始时实在0.5km上,它的class ...

  4. 命令行保存指定目录文件的名字(可包含文件夹文字)到txt文本文件

    Microsoft Visual Studio中配置OpenCV解决方案属性的时候, 需要将OpenCV的lib扩展名的库文件添加到属性的依赖列表里面,网上的有些人博客里面直接给出的会有问题(但大多数 ...

  5. 具体解释Java虚拟机类载入

    概述 在Java语言里面,类型的载入.连接和初始化过程都是在程序运行期间完毕的.虚拟机把描写叙述类的数据从Class文件或其他地方载入到内存,并对数据进行校验.转换解析和初始化,终于形成能够被虚拟机直 ...

  6. 总结一下现在关于Design Support Library的几个博客

    原文转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0713/3179.html 关于Design Support Libr ...

  7. redis主从配置+哨兵模式

    1.搭建redis主从,一个master两个slave,加一个哨兵监听(sentinel),可以新建三个虚拟机,模拟环境,我的电脑没那么多虚拟机,就在一台虚拟机上弄的. 2.安装redis,如果是三台 ...

  8. 神经网络NN笔记

    参考:http://www.cnblogs.com/subconscious/p/5058741.html 俗话说,好记性不如烂笔头~~~~ 边学边记,方便以后查找~~~~~ 一.介绍一下经典的神经网 ...

  9. ligerUI---ligerGrid分页排序的使用(从后台获取数据显示)

    写在前面: 最近项目的前框框架用的是ligerUI,里面用到了ligerGrid表格,下面就来说说从后台获取数据并在前台页面进行完美展示.啊哈哈哈..(天啦,坐我旁边的丽姐貌似炒股 一个月可以搞几十万 ...

  10. Linux:如何进行c++编程

    不适应美帝的饮食,当一只咸鱼在apartment里Coding一波,学习学习如何在Ubuntu实现C++的编程 正文如下: (预备知识) 学习Vim:  http://www.cnblogs.com/ ...