Java编程思想(后)
Java编程思想(后)
持有对象
- 如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序。
- Java中的库基本类型: List, Set, Queue和Map --- 称为集合类.
- ArrayList用add()插入对象, 用get()访问这些对象。
- 如果一个类没有显式地声明继承那个类, 那么它自动继承自Object.
- Java 泛型穿件类会非常复杂, 预定义的泛型会很简单。
- 通过泛型, 可以在编译器防止将错误类型的对象置到容器中。
- 泛型对应的是编译器错误, 而不是运行时错误。
- foreach语法来选择一个List中的每个元素。
- Object有默认的toString()方法。
- Java容器类库的用途是保存对象:
- Collection: 一个独立元素的序列, List, Queue, Set。
- Collection接口概括了序列的概念, 一种存放一组对象的方式。
- List不关心是否存在重复。
- Map: 一组成对的键值对对象, 允许使用键来查找值(字典)。
- Collection: 一个独立元素的序列, List, Queue, Set。
- 任何容器类, 都必须有某种方式可以插入元素将他们再次取回, 持有事物是容器最基本的工作。
- 迭代器(也是一种设计模式): 是一个对象, 它的工作是变量并选择序列中的对象, 而不用直到或关心序列底层的结构。
- 迭代器通常被称为轻量级对象, 创建代价小。
- Java的Iterator只能单向移动, 这个Iterator只能用来:
- 使用方法iterator()要求容器返回一个Iterator, Iterator将返回序列的第一个元素。
- 使用next()获得序列中的下一个元素。
- 使用hasNext()检查序列中是否还有元素。
- 使用remove()将迭代器最近返回的元素删除。
- iterator能够将遍历序列的操作与序列底层的结构分离。
- ListIterator是一个更强大的Iterator的子类型, 它只能用于各种List类的访问。
- ListIterator可以双向移动。
- LinkedList还添加了可以使其用作栈、队列或双端队列的方法。
- 栈通常是指先进先出(LIFO)的容器, 有时栈也被称为叠加栈, 最后压入栈的元素, 第一个被弹出。
- Collection是描述所有序列容器的共性的根接口,它可能会被认为是一个附属接口, 因为要表示其他若干个接口的共性而出现的接口。
java.util.AbstactCollection
类提供了Collection的默认实现。
通过异常处理错误
- Java的异常处理机制建立在C++的基础之上, 使用异常能够降低错误处理代码的复杂度。
异常机制能够保证捕获每个错误。
- 基本异常: 异常情形(exceptional condition)是阻止当前方法或作用域继续执行的问题。
- 当抛出异常后, Java将使用new在堆上创建异常对象, 当前执行路径被终止, 并且当前环境中弹出对异常对象的引用, 异常处理机制接管程序, 并开始寻找一个恰当的地方来继续执行程序。--- 这个恰当的地方就是异常处理程序, 程序要么换一种方式运行, 要么继续运行下去。
- 异常允许强制程序停止运行, 并告诉出现了什么问题, 或者强制程序处理问题, 并返回到稳定状态。
- 所有异常类都有两个构造器: 一个是默认构造器; 另一个是接受字符串作为参数, 以便把相关信息放入异常对象的构造器。
- 使用new创建了异常对象后, 此对象的引用将传给throw。
- 可以把异常简单地看作是一种不同的返回机制, 还能用抛出异常的方式从当前的作用域退出。返回一个异常对象, 然后退出方法或作用域。
- Throwable对象是异常类型的根类。
- 捕获异常:
- 异常是如何被捕获的, 必须首先理解监控区域(guarded region)的概念; --- 它是一段可能产生异常的代码, 后面需紧跟处理这些异常的代码。
- try块: 如果在方法中抛出了异常, 这个方法将在抛出异常的过程中结束。
- catch块: 异常处理程序, 每个catch子句(异常处理程序)看起来就像是接收一个且仅接收一个特殊类型参数的方法。
- 终止与恢复:
- 异常处理理论上有两种基本模型: Java支持终止模型(Java和C++所支持的模型) --- 假设错误非常关键, 程序无法返回到异常发生的地方继续执行, 一旦异常抛出,就表明错误已无法挽回, 也不能继续执行。
- 恢复模型: 异常处理程序的工作是修正错误, 然后重新尝试调用出问题的方法, 并认为第二次能成功。恢复模型通常希望异常被处理之后能继续执行程序 --- 遇见错误时不能抛出异常, 而是调用方法来修正该错误。
- 或者把try块放到while循环中, 直到得到满意的结果。
- 异常处理理论上有两种基本模型: Java支持终止模型(Java和C++所支持的模型) --- 假设错误非常关键, 程序无法返回到异常发生的地方继续执行, 一旦异常抛出,就表明错误已无法挽回, 也不能继续执行。
- 编译器创建了默认构造器, 他讲自动调用基类的默认构造器, 对异常来说, 最重要的部分是类名。
- 异常与记录日志:
- Java可以使用呢
java.util.logging
工具将输出记录到日志中。
- Java可以使用呢
- 捕获所有异常:
catch(Exception e) {System.out.println("Caught an exception");}
- 利用
throw e
重新抛出异常。 - 异常使用指南:
- 应该在下列情况下使用异常:
- 在恰当的级别处理问题。(在直到该如何处理的情况下才捕获异常)。
- 解决问题并重新调用产生异常的方法。
- 进行少许修补, 然后绕过异常发生的地方继续执行。
- 用别的数据进行计算, 以代替方法预计会返回的值。
- 把当前运行环境下能做的事情尽量做完, 然后把相同(不同)的异常重抛到更高层。
- 终止程序。
- 进行简化。
- 让类库和程序更安全。
- 应该在下列情况下使用异常:
字符串
- 字符串操作是极端及程序设计中最常见的行为。
- String对象是不可变的, 每个方法都会创建一个全新的String对象, 以包含修改后的字符串内容。
- 重载'+'与StringBuilder: String对象具有只读特性, 指向它的任何引用都不可能改变它的值。
- JDK自带的工具javap可以反编译代码
javap -c Concatenation
--- 将生成JVM字节码。 - Java中的每个类从根本上都是继承自Object, 标准容器类自然也不例外。--- 都有toString()方法。
正则表达式
- 正则表达式已经整合到标准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
文件。- 某个附加类加载器可能会在数据库中查找字节码。
- 类加载器首先检查一个类的Class对象是否已经加载, 如果尚未加载, 默认的类加载器就会根据类名查找
- 类字面常量:
- Java还提供了另一种方法来生成对Class对象的引用, 即使用类字面常量
FancyToy.class
。 - 类字面常量不仅可以应用于普通的类,也可以应用与接口,数组以及基本数据类型。
- 另外,对于基本数据类型的包装器类,还有一个标准字段TYPE。
- TYPE字段是一个引用,指向对应的基本数据类型的Class。
- TYPE字段是一个引用,指向对应的基本数据类型的Class。
- Java还提供了另一种方法来生成对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.
Java编程思想(后)的更多相关文章
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- 注解的基本盘点 -- 《Java编程思想》
注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在之后的某一个时刻非常方便地使用这些数据. ---<Java编程思想> 其实注解可以理解为一个工具类,只要使用了这个工 ...
- java编程思想第四版中net.mindview.util包下载,及源码简单导入使用
在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...
- Java编程思想学习(八) 内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
- Java编程思想之字符串
来自:Java编程思想(第四版) 第十三章 字符串 字符串操作是计算机程序中最常见的行为. String对象是不可变的.查看JDK文档你就会发现,String类中每一个看起来会修改String ...
- MyEclipse导入ant项目——Java编程思想
北门煎饼东门串儿: <JAVA编程思想(Think in Java)>一书中提供了大量源代码,可是项目是用ant构建的.对于用惯了eclipse,netbeans等IDE的同学们可能有些手 ...
- Java编程思想总结笔记The first chapter
总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章 对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...
随机推荐
- 大神教你如何解决Linux系统80端口被占用
有Linux在centos下面安装webmail服务遇到80端口被占用的问题,导致无法继续安装,下面详细介绍下Linux如何查看.查找.关闭监听80端口服务以更好的的解决80端口被占用的问题. 一.查 ...
- VS2010主题设置及插件推荐
本文主要写了个人使用 VS2010 的一些配置及实用插件,从而打造一个符合个人风格的开发环境. 基础设置 安装 Visual Assist X 在 VS2010 中若不安装 Visual Assist ...
- MYSQL Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as
[2019-04-21 10:17:20] [ERROR] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper:144] Statement viola ...
- Laravel-任务调度
简介Cron 是 UNIX.SOLARIS.LINUX 下的一个十分有用的工具,通过 Cron 脚本能使计划任务定期地在系统后台自动运行.这种计划任务在 UNIX.SOLARIS.LINUX下术语为 ...
- Acitiviti数据库表设计(学习笔记)
ACT_ID_*:与权限,用户与用户组,以及用户与用户组关系相关的表 ACT_RU_*:代表了流程引擎运行时的库表,RU表示Runtime ACT_HI_*:HI表示History当流程完成了节点以后 ...
- dict、defaultdict 和 OrderedDict 比较
一.dict.defaultdict 和 OrderedDict 常见的方法比较 dict.defaultdict 和 OrderedDict 常见的方法比较 dict defaultdict O ...
- 快速搭建一个vue开发环境
常规的搭建就是从npm到vue到webpack这样一个一个的来,这样一套下来说不上复杂但是也不简单.之前公司的vue后台项目 我还是写的轻车熟路的,因为前端同事已经把架子搭好了,环境配置的丝般顺滑,你 ...
- ORACLE数据闪回
ALTER TABLE SPM_CON_PAYMENT_RECEIPT ENABLE ROW MOVEMENT; -- 表名 FLASHBACK TABLE SPM_CON_PAYMENT_REC ...
- Django中ORM介绍
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- (十) 编写UVC程序
目录 编写UVC程序 流程简述 11个ioctl函数 查询属性 VIDIOC_QUERYCAP 枚举格式 VIDIOC_ENUM_FMT 查询当前格式 VIDIOC_G_FMT 尝试某种格式 VIDI ...