Java编程思想(后)

Java编程思想(后)

持有对象

  • 若是一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个很是简单的程序。
  • Java中的库基本类型: List, Set, Queue和Map --- 称为集合类.
    • ArrayList用add()插入对象, 用get()访问这些对象。
  • 若是一个类没有显式地声明继承那个类, 那么它自动继承自Object.
  • Java 泛型穿件类会很是复杂, 预约义的泛型会很简单。
    • 经过泛型, 能够在编译器防止将错误类型的对象置到容器中。
    • 泛型对应的是编译器错误, 而不是运行时错误。
    • foreach语法来选择一个List中的每一个元素。
    • Object有默认的toString()方法。
  • Java容器类库的用途是保存对象:
    • Collection: 一个独立元素的序列, List, Queue, Set。
      • Collection接口归纳了序列的概念, 一种存放一组对象的方式。
      • List不关心是否存在重复。
    • Map: 一组成对的键值对对象, 容许使用键来查找值(字典)。
  • 任何容器类, 都必须有某种方式能够插入元素将他们再次取回, 持有事物是容器最基本的工做。
    • 迭代器(也是一种设计模式): 是一个对象, 它的工做是变量并选择序列中的对象, 而不用直到或关心序列底层的结构。
    • 迭代器一般被称为轻量级对象, 建立代价小。
    • Java的Iterator只能单向移动, 这个Iterator只能用来:
      • 使用方法iterator()要求容器返回一个Iterator, Iterator将返回序列的第一个元素。
      • 使用next()得到序列中的下一个元素。
      • 使用hasNext()检查序列中是否还有元素。
      • 使用remove()将迭代器最近返回的元素删除。
  • iterator可以将遍历序列的操做与序列底层的结构分离。
    • ListIterator是一个更强大的Iterator的子类型, 它只能用于各类List类的访问。
    • ListIterator能够双向移动。
  • LinkedList还添加了可使其用做栈、队列或双端队列的方法。
  • 栈一般是指先进先出(LIFO)的容器, 有时栈也被称为叠加栈, 最后压入栈的元素, 第一个被弹出。
  • Collection是描述全部序列容器的共性的根接口,它可能会被认为是一个附属接口, 由于要表示其余若干个接口的共性而出现的接口。
    • java.util.AbstactCollection类提供了Collection的默认实现。 Java容器的分类

经过异常处理错误

  • Java的异常处理机制创建在C++的基础之上, 使用异常可以下降错误处理代码的复杂度。java

  • 异常机制可以保证捕获每一个错误。程序员

  • 基本异常: 异常情形(exceptional condition)是阻止当前方法或做用域继续执行的问题。正则表达式

    • 当抛出异常后, Java将使用new在堆上建立异常对象, 当前执行路径被终止, 而且当前环境中弹出对异常对象的引用, 异常处理机制接管程序, 并开始寻找一个恰当的地方来继续执行程序。--- 这个恰当的地方就是异常处理程序, 程序要么换一种方式运行, 要么继续运行下去。
    • 异常容许强制程序中止运行, 并告诉出现了什么问题, 或者强制程序处理问题, 并返回到稳定状态。
    • 全部异常类都有两个构造器: 一个是默认构造器; 另外一个是接受字符串做为参数, 以便把相关信息放入异常对象的构造器。
    • 使用new建立了异常对象后, 此对象的引用将传给throw。
    • 能够把异常简单地看做是一种不一样的返回机制, 还能用抛出异常的方式从当前的做用域退出。返回一个异常对象, 而后退出方法或做用域。
    • Throwable对象是异常类型的根类。
  • 捕获异常:数据库

    • 异常是如何被捕获的, 必须首先理解监控区域(guarded region)的概念; --- 它是一段可能产生异常的代码, 后面需紧跟处理这些异常的代码。
    • try块: 若是在方法中抛出了异常, 这个方法将在抛出异常的过程当中结束。
    • catch块: 异常处理程序, 每一个catch子句(异常处理程序)看起来就像是接收一个且仅接收一个特殊类型参数的方法。
  • 终止与恢复:编程

    • 异常处理理论上有两种基本模型: Java支持终止模型(Java和C++所支持的模型) --- 假设错误很是关键, 程序没法返回到异常发生的地方继续执行, 一旦异常抛出,就代表错误已没法挽回, 也不能继续执行。
      • 恢复模型: 异常处理程序的工做是修正错误, 而后从新尝试调用出问题的方法, 并认为第二次能成功。恢复模型一般但愿异常被处理以后能继续执行程序 --- 碰见错误时不能抛出异常, 而是调用方法来修正该错误。
      • 或者把try块放到while循环中, 直到获得满意的结果。
  • 编译器建立了默认构造器, 他讲自动调用基类的默认构造器, 对异常来讲, 最重要的部分是类名。设计模式

  • 异常与记录日志:数组

    • Java可使用呢java.util.logging工具将输出记录到日志中。
  • 捕获全部异常:安全

    • catch(Exception e) {System.out.println("Caught an exception");}
  • 利用throw e从新抛出异常。工具

  • 异常使用指南:ui

    • 应该在下列状况下使用异常:
      • 在恰当的级别处理问题。(在直到该如何处理的状况下才捕获异常)。
      • 解决问题并从新调用产生异常的方法。
      • 进行少量修补, 而后绕过异常发生的地方继续执行。
      • 用别的数据进行计算, 以代替方法预计会返回的值。
      • 把当前运行环境下能作的事情尽可能作完, 而后把相同(不一样)的异常重抛到更高层。
      • 终止程序。
      • 进行简化。
      • 让类库和程序更安全。

字符串

  • 字符串操做是极端及程序设计中最多见的行为。
  • String对象是不可变的, 每一个方法都会建立一个全新的String对象, 以包含修改后的字符串内容。
  • 重载'+'与StringBuilder: String对象具备只读特性, 指向它的任何引用都不可能改变它的值。
  • JDK自带的工具javap能够反编译代码javap -c Concatenation --- 将生成JVM字节码。
  • Java中的每一个类从根本上都是继承自Object, 标准容器类天然也不例外。--- 都有toString()方法。 String的一些方法

正则表达式

  • 正则表达式已经整合到标准Unix工具集之中, 例如sed和awk, 正则表达式是一种强大而灵活的文本处理工具。

  • split()方法,其功能是将字符串从正则表达式匹配的地方切开。 字符类的正则表达式 边界匹配符 字符重复

  • \\表示在正则表达式中插入一个普通(字面上的)反斜杠。

  • 组是用括号来划分的正则表达式, 能够根据组的编号来引用每一个组,0表示整个组, 1表示第一对括号里的组。

  • StringReader将String转换可读的流对象。

  • Scanner的构造器能够接受任何类型的输入对象, 包括File对象, InputStream, String或者Readable对象。

    • 有了Scanner, 全部的输入, 分词以及翻译的操做都隐藏在不一样类型的next方法中。
    • Scanner类能够减轻输入的负担。

类型信息

  • 运行时类型信息使得能够在程序运行时发现和使用类型信息。 --- RTTI(Run-Time Type Identification)。
  • Class对象包含了与类有关的信息。 --- Class对象就是用来建立类的全部的常规对象的。
    • Class类还拥有大量的使用RTTI的其余方式。
    • 类是程序的一部分,每一个类都有一个Class对象; 每当编写而且编译了一个新类,就会产生一个Class对象(被保存一个同名的.class文件中)。
    • 为了生成这个类的对象,运行这个程序的Java虚拟机(JVM)将使用被称为"类加载器"的子系统。
      • 类加载器子系统实际上能够包含一条类加载器链,可是只有一个原生类加载器,它是JVM实现的一部分。
    • 全部的类都是在对其第一次使用时, 动态加载到JVM中。建立第一个类的静态成员的引用时, 就会加载这个类。
      • new操做符建立类的新对象也会被看成对类的静态成员的引用。
  • Java程序在它开始运行以前并不是被彻底加载, 其各个部分是在必须时才加载的。
    • 类加载器首先检查一个类的Class对象是否已经加载, 若是还没有加载, 默认的类加载器就会根据类名查找.class文件。
      • 某个附加类加载器可能会在数据库中查找字节码。
  • 类字面常量:
    • Java还提供了另外一种方法来生成对Class对象的引用, 即便用类字面常量FancyToy.class
    • 类字面常量不只能够应用于普通的类,也能够应用与接口,数组以及基本数据类型。
    • 另外,对于基本数据类型的包装器类,还有一个标准字段TYPE。
      • TYPE字段是一个引用,指向对应的基本数据类型的Class。 class对象
  • 为了使用类而作的准备工做实际包含三个步骤:
    • 加载: 加载器执行,查找字节码,并从字节码中建立一个Class对象。
    • 连接: 在连接阶段将验证类中的字节码, 为静态域分配存储空间,若是必要的话,将解析这个类建立这个类对其余类的全部索引。
    • 初始化: 若是这个类是超类(父类), 则对其初始化,执行静态初始化器和静态初始化块。
      • 初始化被延迟到对静态方法(构造器隐式地是静态的)或者很是数静态域进行首次引用时才执行。
  • 泛化的Class引用: class引用老是指向某个Class对象,能够制造类的实例, 并包含可用做与这些实例的全部方法代码。
    • Class引用表示的就是它所指向的对象的确切类型,而该对象即是Class类的一个对象。
  • 利用cast方法进行转型。
  • instanceof与Class的等价性。
  • RTTI的前提是, 这个类在编译时必须是已知的。
  • 动态代理。
  • 空对象 --- null。
  • interface关键字的一种重要目标就是容许程序员隔离构建, 进而下降耦合性。
  • instanceof关键字返回一个布尔值,告诉咱们对象是否是某个特定类型的实例。
  • 工厂方法设计模式: 将对象的建立工做交给类本身去完成。
    • 工厂方法能够被多态地调用, 从而建立恰当的对象。

泛型

  • 通常的类和方法, 只能使用具体的类型: 要么是基本类型, 要么是自定义的类。若是要编写能够应用于多种类型的代码, 这种限制对代码的约束会很大。
  • 在面向对象编程中, 多态是一种泛化机制。
  • final类不能扩展, 其余任何类均可以被扩展。
  • 泛型实现了参数化类型的概念, 是代码能够运用于多种类型, 但愿类或方法具备最普遍的表达能力。
  • Java的泛型相比C++来讲要弱不少。 --- 理解边界所在,只有知道一个技术不能作什么,才能更好地作到所能作的。
  • 元组(tuple):是将一组对象直接打包存储于其中的一个单一对象,容许读取其中元素,但不容许向其中存放新的对象。(数据传送对象)。
  • 泛型也能够应用于接口, 例如生成器(generator) --- 专门负责建立对象的类。
  • 泛型的主要目的之一就是用来指定容器要持有什么类型的对象,并且由编译器来保证类型的正确性。
  • Java泛型的核心概念: 告诉编译器想使用什么类型, 而后编译器帮助处理一切细节。 --- 能够简单地认为泛型和其余类型差很少,只是多了参数列表而已。
  • 声明为final的元素便不能再赋予其余值了。
  • 基本类型不能做为泛型的类型参数。
  • 建立一个适配器(adapter)来实现所需的接口。
  • static方法,没法访问泛型类的类型参数, 若是static方法须要使用泛型能力,就必须使其成为泛型方法。
  • 在使用泛型类时, 必须在建立对象的时候指定类型参数的值,而使用泛型方法的时候,一般没必要指明参数类型, 由于编译器会自动找出具体的类型, --- 类型参数腿短(type arguement inference)。
  • 编译器可以从泛型参数列表中的一个参数推断出另外一个参数。
  • 泛型方法与可变参数可以很好地共存。
  • 生成某个类对象的类,必须具有两个特色:
    • 它必须声明为public;
    • 必须具有默认的构造器(无参数的构造其)。
  • 泛型的一个重要好处是可以简单而安全地建立复杂的模型。

泛型方法

  • 泛型方法使方法可以独立于类而产生变化。
    • 使用泛型方法能够取代将整个类泛型化。
  • 在泛型代码内部,没法得到任何有关泛型参数类型的信息。
  • Java泛型重用了extends关键字。
  • 无界通配符<?>看起来意味着任何事物, <?>能够被认为是一种装饰。
  • 混型的价值之一是它们能够将特性和行为一致地应用与多个类之上。

数组

  • 数组与其余容器之间的区别有三方面: 效率, 类型和保存基类类型的能力.
    • 数组是一种效率最高的存储和随机访问对象引用序列的方式.
    • ArrayList.
  • 数组是第一级对象.
  • 返回一个数组.
  • 多维数组.
  • 数组与泛型.
  • Arrays实用功能.

容器深刻研究

  • 完整的容器分类法 深刻容器
  • 散列与散列码 --- HashMap.

Java I/O系统

  • File类
  • Reader和Writer.
相关文章
相关标签/搜索