《Java学习笔记(第8版)》学习指导
目录
图书简况
林信良(网名:良葛格,网站)的《Java学习笔记(第8版)》是咱们《Java程序设计》课程的教材,封面以下:php
Java的教材很多,除了内容深刻浅出,这本书最大的优势是更新比较及时,第八版针对Java SE 8新功能全面改版,不管是章节架构或范例程序代码,都作了从新编写与全面翻新。咱们课上从第6版就开始用它做教材,这本书总结了做者多年来的教学实践经验,聚集了学员在学习课程或认证考试中遇到的概念、操做、应用等问题及解决方案。html
教材中的一些问题:java
- 术语与大陆不同,参考我总结的「术语对照」,书中大部分术语有了转换,但没有彻底转换
- 改版后有些内容该删除没有删除,好比p497 关于Date和Calendar那段总结
- 有些代码存在一些问题,好比P64 Shift.java
考虑到你们这学期也在学习《数据结构》,我另一门课程《程序设计与数据结构》 课程教学》的教材《Java程序设计与数据结构教程(第二版)》供你们学习参考。在《程序设计基础》和《Java程序设计》中学习编程;在《数据结构》中学习高效编程;在《安全软件工程》或《安全编程技术》中学习安全高效编程;这是信息安全专业的专业进取路径。node
返回目录
python
教材导读
Windows下Java开发环境,对于初学者推荐「JDK + Vim + PowerCMD」。若是感受学Vim有点困难,初期可使用「JDK + jEdit + PowerCMD」或「JDK + NotePad++ + PowerCMD」。mysql
Linux下Java开发环境,对于初学者推荐使用「Git+Openjdk+Vim」.在Ubuntu14.10后的版本中的安装命令是:android
sudo apt-get install git
sudo apt-get install vim
sudo apt-get install openjdk-8-jdk
旧版本的Ubuntu中安装openjdk8, 参考How to Install OpenJDK 8 in Ubuntu 14.04 & 12.04 LTS.git
若是你用的是MacBook的macOS操做系统,就不用安装Ubuntu虚拟机了,把macOS当Linux用就好了。程序员
对于IDE(Integrated Development Environment,集成开发环境),图书上使用的是NetBeans,考虑到咱们课程会涉及到Android开发,而用于Android开发的IDE Android Studio(CN)是在Intellij IDEA上构建的,因此咱们上课推荐的IDE是Intellij IDEA。github
Intellij IDEA是收费软件,但对学生免费,能够到这里申请无偿使用。
这里有IDEA的使用教程,包括很多视频教程。IDEA的使用过程当中要慢慢掌握经常使用的快捷键(哪一个经常使用就刻意记忆一下,参考十大Intellij IDEA快捷键).IDEA的快捷键以下图所示:
其余工具和教程参考「程序开发与信息安全工具箱」。
课程相关信息参考「《Java程序设计》 课程教学」。
相关连接
注意,这些代码都要求同窗们本身一行一行的输入,运行,调试;提供下载连接主要是方便在遇到一些本身找不到的错误时对照用,千万不要把代码拷贝过去编译运行一下就完了,这样基本上什么也学不到!!!
参考代码驱动的程序设计学习中的「git的安装测试」部分,创建与教材配套的目录结构,目录要体现出本身学号姓名
,以下图所示:
返回目录
第一章 Java平台概论
1.1 Java不仅是语言
- 了解Java的历史
- 为何须要Java程序设计语言?
- Java解决了什么问题?
- 识记Java三大平台:
- Java SE(Java 2 Platform Standard Edition)
- Java EE(Java 2 Platform Enterprise Edition)
- Java ME(Java 2 Platform Micro Edition): 不用学了,学Android就好
- Java SE的四个组成部分
- JVM,JRE,JDK与Java语言
- 学习Java API的重要性
- 了解JCP与JSR、RI、TCK的关系
- 了解Oracle JDK与OpenJDK的关系
- 了解Java的学习路径,参考Java Technology Concept Map
- 深刻理解JVM/JRE/JDK
- 面向对象技术
- Java API: 从父类学起,注意继承体系
- 容器
- p11讲的「容器(Container)」的观念很是重要。
- 研究源码
- JDK安装时选上源代码,安装后在JDK的安装目录下会有一个src.zip:
- Java官方demo是学习的好资源
- 学习设计模式和重构
- 模式是专家经验的总结,想学习设计专家的经验就要学习设计模式,在面向对象的学习中,设计模式和面向过程当中的数据结构和算法的地位同样重要
- 重构是不改变功能的前提下改善程序结构,如今的Java开发IDE如NetBeans,Intellij IDEA中都有一个菜单项
Refactor(重构)
,你就理解重构的重要性了。
- 思考题:
- 这一节的标题是「Java不仅是语言」,学完这节内容后你认为Java仍是什么?
1.2 JVM/JRE/JDK
相关连接
拓展
返回目录
第二章 从JDK到IDE
2.1 从Hello World 开始
- 使用命令行和IDE两种方式编辑、编译、运行「Hello World」程序,一旦能够运行「Hello World」程序,就说明你建好了Java 开发环境,而且有很大的成就感,以后彻底就能够参考「积极主动敲代码,使用Junit学习Java程序设计」来学习了。能够看看「实验一 Java开发环境的熟悉」。
- 在Window下学习Java开发,参考一下「Java程序设计的DOS命令基础」
- 在Unix/Linux下学习Java开发,参考一下「别出心裁的Linux命令学习法」
- 理解
PATH
是用于Windows/Unix/Linux等系统的,找不到javac.exe
、java.exe
是由于PATH
没有设置正确
- 理解
CLASSPATH
是用于JVM(容器)的,使用javac
和java
命令找不到XXXX.class
是由于CLASSPATH
没有设置正确
- 理解「JVM是Java程序惟一识别的操做系统,对JVM来讲,可执行文件就是扩展名为
.class
的文件」
- XXXX.class的路径能够用
java -cp
或 java -classpath
指定,此时就不用设定CLASSPATH
环境变量了
编译、运行p31的Main.java
,其中相关的Console.java
的内容是:
public class Console {
public static void writeLine(String text) {
System.out.println(text);
}
}
- 思考题:
- 编译、运行「Hello World」时你遇到了什么问题?怎么解决的?(参考)
2.2 管理源码与二进制文件
2.3 使用IDE
动手:
相关连接
返回目录
第三章 基础语法
3.1 类型、变量与运算符
- 类型
- 基本类型
- 整数(short、int、long)
- 字节(byte)
- 浮点数(float/double)
- 字符(char):汉字、英文字符都是双字节的,Java字符编码是
Unicode6.2.0
,JVM编码是UTF-16 Big Endian
- 布尔(boolean):boolean类型中的true/false不能与其余类型进行运算
- 类类型
- 注释
- 三种注释
- //:单行
- /**/:多行
- /** */:javadoc文档注释
- 为什么要注释
- 简洁的点明程序的突出特征或是提供一种概观,帮助别人理解程序,提升程序的可读性
- 注释为何(why),不要注释作什么(what),伪代码是最好的注释(参考「实验二 Java面向对象程序设计」)
- 注释注意事项
- 给函数和全局数据加上注释
- 要澄清状况,不要添乱子
- 不要大谈明显的东西
- 不要注释差的代码,重写它
- 不要与代码矛盾(javadoc)
- 否认之否认规律
- 变量
- 字面常量(Literal constant)
- 整数能够用二进制(0bdddd),八进制(0ddd)、十进制(dddd)、十六进制(0Xdddd),Java中都是有符号下整数,没有
unsigned int
之类
- 浮点数科学计数法
- 小数(如1.4)默认类型是
double
,1.4f
或1.4F
的类型才是float
- 字符能够用Unicode 字符编码(Code Point)来表示。参考「字符编码」。
- Java SE7 后能够用下划线分隔数字,如:123_456,3.141_592_653,0b1010_0011.
- 运算符
- 算术运算
- 关系运算:注意不要对浮点数进行相等性运算,能够试试
1.0-0.7==0.3
?
- >、>=、<、<=、==、!=
- Conditional Operator: 条件表达式 ? 成立时返回值:失败时返回值
- 逻辑运算:运算结果是boolean值:true Or false
- 位运算 :运算结果为位串(位向量),经常使用于掩码(Mask)运算
- 与(&):全1为1,有0则0
- 或(|):全0为0,有1则1
- 非(~):书上说是
补码
,按咱们的习惯应该是反码
- 异或(^):相同为0,不一样为1
- 左移(<<):最右补0
- 算术右移(>>):右移后,正数最高位补0,负数最高位补1
- 逻辑右移(>>>):右移后,最高位老是补0
- 递增、递减
- 赋值
- =
- +=, -=, *=, /=, %=,&=, |=, ^=, <<=, >>=
- 类型转换
短->长
(widening)是安全的,长->短
(narrowing)必须强制转换
- 表达式中含不一样类型,以长度最长的为准,其余的会进行类型提高(Promote)
3.2流程控制
- Structured programming(结构化程序设计)包含三种语句
- 顺序:计算机结构决定语句是顺序执行的,正常状况下都是顺序执行的
- 分支:分支用来处理异常状况的
- 循环:执行最经常使用的语句,这是计算机的特长
- 分支
- 类型
- if
- if...else
- if...else if
- switch...case
- switch可用于整数、字符、字符串、Enum
- default
- 分支的各类状况要知足
不重复,不遗漏
的原则,即:「MECE」(Mutually Exclusive Collectively Exhaustive,相互独立,彻底穷尽)
int daysPerMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31}
int daysOfTheMonth(int month){
return daysPerMonth(month-1);
}
- 循环
- 类型
- break/continue
- 配合标签能够实现
goto
的效果
goto
可用于从多重循环是跳出来
动手:
编辑输入、编译、运行相关代码,并思考相关问题,会调试就更好了(参考「遇到问题为何应该本身动手」)
很多都是代码段,本身新建一个 TestJavaBasic.java
的类,把代码段输入进行测试,好比p57代码:
public class TestJavaBasic {
public static void main(String[] args) {
p57test();
}
public static void p57VariableTest(){
int number = 10;
double PI = 3.14;
System.out.println(number);
System.out.println(PI);
}
}
- p55 Range.java: Java基本类型的范围
- Byte与byte什么关系?其余类型呢?
- printf的各类格式控制符号怎么使用?找一种本身没有用过的测试一下。参考p65 表3.1和Formatter
- P69 Comparison.java: 关系运算
- P62 Bitwise.java: 位运算
- 理解位运算的结果是位串(位向量)
- 尝试增长代码,测试多个位的运算,好比:0xABCD & 0xF0F0
- 设计几个掩码,好比:把一个整数的某个位清零,把一个整数的某个位清零
- p64 Shift.java: 移位
- 理解好位运算对密码学的学习有帮助
- 这个程序的运行结果跟教材中同样吗?
- p69 Odd.java: if...else
- p71 Level.java
- 符合「MECE」吗?
- score = 100,结果如何?
- score = 120,结果如何?
- 代码效率如何?怎么改进?怎么证实有改进?
- p73 Level2.java: switch
- p74 OneToTen.java: for
- p74-p75 NineNiteTable.java NineNiteTable2.java
1*1= 1
1*2= 2 2*2= 4
1*3= 3 2*3= 6 3*3= 9
1*4= 4 2*4= 8 3*4=12 4*4=16
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
- p76 RandomStop.java RandomStop2.java
- 思考题:
课后练习
+ 选择题
+ 实现
相关连接
拓展
返回目录
第四章 认识对象
- 对象(Object):存在的具体实体,具备明确的状态和行为
- 类(Class):具备相同属性和行为的一组对象的集合,用于组合各个对象所共有操做和属性的一种机制
- 从类看对象:类定义能够视为一个具备相似特性与共同行为的对象的模板,可用来产生对象
- 从对象看类:类的产生,是从少数实例,推广到大量类似实例的抽象化过程(abstraction)
- 类是对象的设计图,对象是类的实例,生成对象要先定义类
4.1 类与对象
4.2 基本类型包装
- 为了让Java 基本类型像类同样使用
- int-Integer
- long-Long
- byte-Byte
- float-Float
- double-Double
- boolean-Boolean
- ...
- 理解Autoboxing和Unboxing
- Autoboxing和Unboxing是编译器语法糖
4.3 数组对象
- Java中,数组是对象
- 与C语言不一样,Java检查数组边界,越界会触发
ArrayIndexOutOfBoundsException
异常
- 数组访问的
foreach
语法
- 理解图4.五、4.六、4.七、4.8
- System.arraycopy()与Arrays.copyof()
- javac -encoding 指定字符编码
- 思考题:
- 举例说明什么是浅拷贝与深拷贝?
- 你遇到过乱码的状况没?有的话如何解决问题的?
4.4 字符串对象
- String/StringBuffer/StringBuilder
- 思考题:
- C语言中怎么实现数字与数字字符串的互换,如:123->“123”, “123”->123
- int atoi(const char *nptr);// aoti("123")->123
- char itoa( int value, char string,int radix);// itoa(123, str, 10)->"123", str=="123"
- Java中怎么实现数字与数字字符串的互换,如:123->“123”, “123”->123
- int atoi(String nptr)
- String itoa(int value, int radix)
4.5 查询API文档
有人用Visual Studio学完C语言后,居然不知道MSDN。遇到问题不知道去哪寻找答案。
学习Java,一样要学会使用Java API,在Windows下必定要下载CHM格式的Java API,这个版本具备检索功能,使用很是方便。
如何利用Java API来学习,参考「积极主动敲代码,使用Junit学习Java程序设计」。
动手:
编辑输入、编译、运行相关代码,并思考相关问题,会调试就更好了(参考「遇到问题为何应该本身动手」)
很多都是代码段,本身新建一个 TestJavaClass.java
的类,把代码段输入进行测试,如p87页代码:
public class TestJavaClass {
public static void main(String[] args) {
p87TestFloatEquals();
}
public static void p87TestFloatEquals() {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if ((a+b+c) == 0.3){
System.out.println("等于0.3");
} else {
System.out.println("不等于0.3");
}
}
}
- p84 Field.java: 访问对象的成员变量
- sun == spring?
- 与C语言结构体作比较
- p85 Field2.java: 构造方法的使用,构造方法决定了生成对象的方式
- 构造方法的参数与类成员变量同样,经过this区分
- 加一行
Clothes2 autumn = new Clothes2();
能编译、运行吗?为何?
- p86 Guess.java: Scanner
- 类比C语言的
scanf
- 查API文档,学习测试相关API
- nextXXX()的使用
- next()
- nextLine()
- 修改代码,测试学习效果,好比增长代码,完成「打印两遍本身输入的字符串」的功能
- p88 DecimalDemo.java: BigDecimal
- 运行结果和你想象的同样吗?若是不是问题在哪?
op1.add(op2).add(op3).equals(result)
是什么用法?
- 查API文档,学习测试相关API
- plus()
- substract
- multiply
- divide
- 修改代码,测试学习效果,好比打印两个整数的乘积
- 挑战一下本身,完成一个实用软件。参考「小学四则运算题目软件」
- p91 IntegerDemo.java: Wrapper
- 查Java API文档,学习测试Integer类的其余方法,并写代码测试
- 查Java API文档,学习测试其余Wrapper类(Long,Double,Float,Boolean...),并就其中一个写代码测试
- p96 Score.java: for遍历数组
- p97 XY.java :二维数组
- 外层循环得到行数(row),内层循环得到列(column)
- 使用foreach语法改写代码
- p98 Score2.java: Arrays类
- 查API文档,学习测试Arrays类相关的API
- 把scores填充成{55,65,65,80,75,70,95,90,85,100},测试一下Arrays类的各类排序方法
- p101 IrregularArray.java: 不规则数组
- p102 IntegerArray.java: 对象数组 (用类声明的数组)
- 先想一下结果,看看实际是否是这样
- 理解图4.10,4.11
- p104 CopyArray.java: 数组复制
- p105 ShallowCopy.java: 对象数组浅拷贝
- 先想一下结果,看看实际是否是这样
- 理解图图4.12
- p106 DeepCopy.java: 对象数组深拷贝
- System.arraycopy()和Arrays.copyOf()用在对象数组上都是浅拷贝
- 何时须要深拷贝?
- p108 Sum.java: 字符串转成数字
- parseLong的功能?
- nextLine的功能?
- 输入11.1试试,会是什么效果?若是有问题怎么解决?
- p109 Average.java: 命令行参数
- args数组的功能?
- 怎么获取命令行参数的个数?
- C语主和Java的main函数的命令行参数有什么不一样?
- IDE中怎么传命令行参数?
- p112 OneTo100.java: StringBuiler
- 参考第十三章,教材上打印1-100的几种方式的效率怎么测试?假设打印100000遍
课后练习
- 选择题
- 1-3:boxing unboxing,不运行试试极可能作不对
- 4-5: 数组概念
- 6-10:String
- 实现题
- Fibonacci
- 递归:递归公式,终止条件
- Java中能求的最大的Fibonacci数是多少?
- 洗牌
- 排序:Arrays.sort
- 查找:Arrays.binarySearch
相关连接
返回目录
第五章 对象封装
5.1 何谓封装
- 封装(Encapsulation)实际上使用方法(Method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,隐藏对象细节,将对象看成黑箱进行操做
- 经过
构造方法(构造函数)
封装初始化流程
- 经过
成员方法(函数)
封装操做
- 经过
成员变量
封装数据
- 封装与SRP原则
- 封装的好处
- 模块化(Modularity)
- Source code independence
- Object Passing
- 信息隐藏(Information hiding)
- 对象内部的状态被保护起来了,不会被与该对象沟通的对象直接修改
- 对象内部特征的变化不会改变与其余对象沟通的方式
5.2 类语法细节
- public
- private
- 用在类前,能够吗?
- 用在方法前,能够吗?
- 用在成员变量前
- 方法重载(Overload)
- this与super
- final
- static:全部对象公有的
- 用在类前
- 用在方法前
- 用在成员变量前
- 访问惯例:
类名.static成员
- 与C语言中的static区分
- import static 的用法
- 变长参数
- 内部类
- Java中方法都是传值(Pass By Value)的
- 传值(Pass By Value,Call by Value)
- 传引用(Pass By Reference,Call by Reference)
- 对比C语言中的传值,传指针,想一想swap如何实现
动手:
课后练习
- 选择题
- 1-7:构造方法,不运行试试极可能作不对
- 8,10: 变长参数,仔细看题
- 9: 重载顺序
- 实现题
相关连接
返回目录
第六章 继承与多态
6.1 何谓继承
- 继承也符合DRY(Don't Repeat Yourself)原则
- ISA与OCP原则,LSP原则
- 参考实验二 Java面向对象程序设计中的「S.O.L.I.D」原则
- 赋值: 「=」 右边 ISA 左边,不然要强制类型转换
- Role role1 = new SwordsMan()
- SwordsMan swordsman = role1; //x
- SwordsMan swordsman = (SwordsMan)role1; //ok
- 注意ISA是指功能上的
- extends
- Java中只有单一继承,也就是只能有一个父类
- 要实现C++中的多重继承,要使用第七章中的「接口(Interface)」
- UML
- 多态
- 继承能够复用代码,更大的用处是实现「多态」
- 封装是继承的基础,继承是多态的基础
- 「用父类声明对象引用,用子类生成对象」就有了多态
- 覆盖(Override)
- 区分重载(Overload)
- Annotation:@override
- 抽象方法、抽象类
- abstract
- Java中有抽象方法的类必定是抽象类,但抽象类中的方法不必定都是抽象方法
- 抽象类不能使用new生成对象
- 思考题:
- Square(正方形)类继承Rectangle(矩形)类合适吗?
6.2 继承语法细节
- public/package/protected/private
- super与this
- java.lang.Object
- toString
- equals
- hashCode
- instanceof
- 垃圾收集(Garbage Collection,GC)
- 没法经过变量引用的对象就是GC认定的垃圾对象
- 垃圾回收前会调用finalize()方法,但因为调用时机没法肯定,建议不要使用finalize()方法
- 设计模式
动手:
- 编辑输入、编译、运行相关代码,并思考相关问题,会调试就更好了(参考「遇到问题为何应该本身动手」)
- 很多都是代码段,本身新建一个
TestJavaInheritance.java
的类,把代码段输入进行测试
- p158 SwordMan.java Magician.java: 两个类有重复代码,DRY,继承
- p159 Role.java: 定义父类
- p160 p161 SwordMan.java, Magician.java RPG.java: 继承消除重复代码
- p165 RGP.java: ISA
- 函数参数用声明用父类,实参能够传子类
- 代码具备灵活性
- p167 Role.java SwordMan.java Magician.java RPG.java: 覆盖
- p169 Role.java : 抽象类
- p171 Role.java Swordman.java Magician.java : protected
- p173 Role.java Swordman.java Magician.java : 覆盖toString
- 以上四个代码只要在原来基础上稍微改改,而后经过运行代码理解相关知识点
- p178 ArrayList.java : Object类的应用
- p179 Guest.java是自定义ArrayList的测试类
- p181 Cat.java :注意如何覆盖equals
- 如何写Cat的测试类,让各个return都能访问到
- p185 Guess.java : 抽象类
- OCP带来的灵活性
- p186 GuessGame.java
- p187 ConsoleGame.java
- p187 Guess.java: 测试类
- 体会「计算机科学领域的任何问题均可以经过增长一个间接的中间层来解决」
课后练习
- 选择题
- 1-5: 覆盖
- 6: 抽象类、抽象方法
- 7-10: this,super
- 实现题
- 覆盖toString
- 覆盖equals
- 先看看是否是和本身比较,本身与本身比较确定相等
- 再看看是否是本类或子类(instanceof),不一样类确定不等
- 而后定义逻辑上的相等
- 覆盖equals()必定要同时覆盖hashCode()
相关连接
返回目录
第七章 接口与多态
7.1 何谓接口
- 接口(interface)定义行为
- implements
- 解决需求变动
- 思考题:
7.2 接口语法细节
- 接口中的
public abstract
能够省略
- 接中可使用extends继承接口,而且能够继承多个接口
- 匿名内部类与Lambda
- JDK8 前在匿名内部类中访问局部变量,则该局部变量必须为final
- emum
动手:
课后练习
相关连接
无
面向对象技术深化
敏捷开发技术
返回目录
第八章 异常处理
前面Java核心和面向对象思想都讲解了,后面的内容都是使用Java的各类类库了,学习时注意面向对象思想在类库中的应用。
8.1 语法与继承架构
- 使用try...catch
- 与C语言中程序流程和错误处理混在一块儿不一样,Java中把正常流程放try块中,错误(异常)处理放catch块中
- catch 多个异常
- API文档中带throws的必须使用try...catch,以下图
- 注意多个catch必定把父类放后面
- 异常架构
- Error及其子类写程序不用处理,最多留个日志
- Java异常处理是要处理
Exception
类及其子类(Checked Exception)
- Multi-catch:类之间不能有继承关系
- 学习Java API时必定对上层的类好好研究,学习,再学习和应用子类时就比较容易了
- catch or throw?
- throws:本身没法处理,用在方法声明
- throw:方法中抛出Checked Exception,方法声明中必须有throws
- 自定义异常
- 异常堆栈
- printStackTrace
- 善用堆栈追踪错误
- 代码中不要私吞异常
- 不要错误处理异常
- 处理时不要显示错误信息
- printStackTrace 和fillInStackTrace
- assert
- 使用finally
- try with resources
- java.lang.AutoCloseable
- try with resources的对象必须实现AutoCloseable接口
- 思考题:
动手:
import java.io.IOException;
import java.awt.Button;
import java.util.Vector;
class ExceptionTest {
public static void main (String args[])
{
System.out.println("Entering main()");
ExceptionTest et = new ExceptionTest();
try {
System.out.println("Calling m1()");
et.m1();
System.out.println("Returning from call to m1()");
}
catch (Exception e) {
System.out.println("Caught IOException in main()");
}
System.out.println("Exiting main()");
}
public void m1() throws IOException
{
System.out.println("Entering m1()");
Button b1 = new Button();
try {
System.out.println("Calling m2()");
m2();
System.out.println("Returning from call to m2()");
System.out.println("Calling m3()");
m3(true);
System.out.println("Returning from call to m3()");
}
catch (IOException e) {
System.out.println("Caught IOException in " +
"m1()...rethrowing");
throw e;
}
finally {
System.out.println("In finally for m1()");
}
System.out.println("Exiting m1()");
}
public void m2()
{
System.out.println("Entering m2()");
try {
Vector v = new Vector(5);
}
catch (IllegalArgumentException iae) {
System.out.println("Caught " +
"IllegalArgumentException in m2()");
}
finally {
System.out.println("In finally for m2()");
}
System.out.println("Exiting m2()");
}
public void m3(boolean genExc) throws IOException
{
System.out.println("Entering m3()");
try {
Button b3 = new Button();
if (genExc)
throw new IOException();
}
finally {
System.out.println("In finally for m3()");
}
System.out.println("Exiting m3()");
}
}
课后练习
相关连接
返回目录
拓展
第九章 Collection与Map
Java实现的「数据结构」,能够和《数据结构》课程结合学习。
Collection:表示多个对象,多了才有研究算法效率的必要。
9.1 使用Collection集合对象
- 认识collection架构
- 再次体会先掌握父类再学习子类的好处
- 如何正确使用Collection API和《数据结构》课程学的如何有很大关系
- Connection: 增、删、遍历对象
- add
- remove
- clear
- size
- iterator
- List: 相似数组,具备位置信息,带索引
- 核心方法
- add(int index, E element)
- remove(int index)
- set(int index, E element)
- ArrayList
- LinkedList
Set: 其中的对象不能有重复的
- Queue: 队列
- 核心方法
- Deque: 双向队列
- 注意区分泛型与继承
- Lambda表达式
- Iterable与Iterator
static void forEach(Collection collection) {
Iterator iterator = colleciton.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
static void forEach(Iterable iterator) {
for(Object o: iterable){
System.out.println(o);
}
}
- Comparable与Comparator
- sort:Java中对象排序,要么对象实现了Comparable能够直接sort要么提供Comparator对象告知sort如何排序
9.2 键值对应的Map
数组是用数字索引(Key),Map能够看做能够用非数字索引(Key)的数组
- 经常使用的Map类
- Dictionary与HashTable不建议使用
- Map
- put
- get
- size
- remove
- forEach
- HashMap
- TreeMap
- Properties:配置文件
- 访问Map键值
动手:
编辑输入、编译、运行相关代码,并思考相关问题,会调试就更好了(参考「遇到问题为何应该本身动手」)
- 很多都是代码段,本身新建一个
TestJavaCollection.java
的类,把代码段输入进行测试
- p266 SimpleLinkedList.java: Java版链表实现
- 对比《数据结构》课上的C语言版
- 这个程序能编译经过吗?
- p268 WordCount.java: Set
- p269 Student.java: 怎么算重复
- p270 Student2.java: 带equals和hashCode
- p272 RequestQueue.java: 测试Queue的使用
- LinkedList能够当作Queue吗?
- 注意匿名类的使用
- p273 Stack.java: 用ArrayQueue实现栈
- p275 ArrayList.java: 泛型版的ArrayList
- p272 RequestQueue2.java: Lambda表达式的使用
- p283 ForEach.java: 利用iterable实现foreach
- p284 Sort.java: 使用Collection.sort对整数排序
- p285 Sort2.java: 自定义类型的排序,有问题
- p285 Sort3.java: 自定义类型的排序,实现Comparable接口
- p287 Sort4.java: String默认实现升序
- p288 Sort5.java: 使用Comparator 实现对String的降序排序
- Collection.sort的重载方法
- Sort4.java,Sort5.java说明Java中对象排序,要么对象实现了Comparable能够直接sort,要么提供Comparator对象告知sort如何排序对String的降序排序
- 修改代码,使用Lambda表达式实现
- p290 Sort6.java: 优先排null
- import statci
- nullsFist
- reverseOrder
- p291 Messages.java: 使用HashMap
- p292 Messages2.java: 使用TreeMap排序
- p292 Messages3.java: 使用TreeMap反序排序
- p293 LoadProperties.java: 如何操做配置文件
- person.properties文件应该放在什么位置?
- p294 LoadSystemPros.java
- p295 MapKeyValue.java: keySet访问键,values访问值
- 教材上说使用HashMap时结无序,为何个人运行结果以下?下面的结果有序吗?
显示键
one
two
three
显示值
一
二
三
- 修改代码,使用TreeMap试试结果,有序吗?
- 代码中的forEach都是在什么类中定义的?
- p296 MapKeyValue2.java: entrySet,泛型
p297 MapKeyValue3.java: 使用Lambda表达式
课后练习
相关连接
拓展
返回目录
第十章 输入与输出
- 文件的读写
- 网络上传数据的基础
一样要先掌握父类中方法,核心类以下:
- 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的
- InputStream与OutputStream
- 标准输入输出
- System.in: 标准输入,默认关联到键盘(终端输入)
- System.out: 标准输出,默认关联到显示器(终端输出)
- System.err: 标准错误,默认关联到显示器(终端输出)
- 输入输出重定向:setIn,setOut,setErr
- FileInputStream与FileOutPutStream
- 装饰器类
- Decorator模式
- BufferedInputStream与BufferedOutputStream: 内部提供缓冲,提升效率
- DataInputStream与DataOutputStream:基本数据类型与字节的转换,API好好研究一下
- ObjectInputStream与ObjectOutputStream
10.2 字符处理类
动手:
课后练习
相关连接
拓展
返回目录
第十一章 线程与并行API
Java语言内置多线程
11.1 线程
- 线程
- Thread与Runnable
线程生命周期
- 线程控制的一些方法
- interrupt
- sleep
- join
- stop(Deprecated)
- resume(Deprecated)
- suspend(Deprecated)
- destroy(Deprecated)
- 线程的中止、暂停、重启要程序员设定实现条件或使用并发API,不要调用Deprecated的方法
- 同步:synchronized与volatile
- wait、notify、notifyAll
- ThreadGroup
- setMaxPriority
- enumerate
- activeCount
11.2 并行API
- Lock
- ReadWriteLock
- Condition
- Executor
- ScheduledThreadPoolExecutor
- ForkJoinPool
- 并发Collection
动手:
编辑输入、编译、运行相关代码,并思考相关问题,会调试就更好了(参考「遇到问题为何应该本身动手」)
- 很多都是代码段,本身新建一个
TestJavaThread.java
的类,把代码段输入进行测试
- p325 TortoiseHareRace.java: 单线程版龟兔赛跑
- flags数组有什么做用?C语言中须要这么处理吗?
- 多运行几回,看看程序运行结果同样吗?
- p326 Tortoise.java Hare.java TortoiseHareRace2.java: 多线程版的龟兔赛跑
- 研究一下Runable接口的API
- 注意线程的生成方式,为何能够这么作?
- 代码运行中发现了什么问题?
- TortoiseHareRace2运行时共有几个线程?
- 若是有Linux或Windows下多线程程序设计经验,与Java多线程对比一下有什么不一样。好比:
- Linux中,主线程结束了,进程也结束了,程序就退出了,Java中是这样的吗?
- p330 DaemonDemo.java: Daemon线程
- 注释掉thread.setDaemon(true);,对比一下运行结果
- 注意产生线程默认是setDaemon(false)的
- P331 Download.java和Download2.java: 单线程和多线程的下载
p333 InterruptedDemo.java: interrupt唤醒线程
- p334 JionDemo.java: join
- p337 ThreadGroupDemo.java:
- 调用了Thread哪一个构造方法?
- 理解Lambda表达式
- p338 ThreadGroupDemo2.java: 处理线程没捕捉的异常
- Exception:异常, 台湾翻译成「例外」
- 理解运行结果
- p339 ArrayListDemo.java
- p343 DeadLockDemo.java: 死锁
- 多运行几回,看看能不能出现死锁
- 如何修改代码保证没有死锁?
- p350 p351 Producer.java Consumer.java Clerk.java ProducerConsumerDemo.java: 生产者消费者
- p354 ArrayList.java: 线程安全的ArrayList
- p355 NoDeadLockDemo.java: tryLock
- p357 ArrayList2.java: ReadWriteLock
- p359 ArrayList3.java: StampedLock
- p361 Clerk.java: Condition
- 用完整的生产者消费者代码测试
- 生产者消费者共用一个Condition对象
- p363 Clerk2.java
- 用完整的生产者消费者代码测试
- 生产者消费者各有一个Condition对象
- p36四、p36五、p366 Pages.java DirecExecutor.java Download.java:
p366 p367 ThreadPerTaskExecutor.java Download2.java:
p368 Download3.java: ThreadPoolExecutor
p369 FuterCallableDemo.java: Future,Callable
- p370 FuterCallableDemo.java: Future,Callable
p371 SheduledExecutorServiceDemo.java: SheduledExecutor
p374 FibonacciForkJoin.java: ForkJoinPool
- P376 p377 Producer3.java Consumer3.java: 并发Collection的应用
课后练习
相关连接
返回目录
第十二章 Lambda
12.1 认识Lambda语法
- Lambda 教材的引入循序渐近、深刻浅出
- Lambda去重复,回忆DRY原则
- Lambda表达式可读性更好
- Arrays.sort
- Comparator: 对比C语言中使用函数指针
- 匿名类与多态
- 方法引用(Method Reference)
- 新语法
- 一条语句用Lambda表达式,多条语句用方法引用
- 函数接口(Functional Interface)
- 就是只有一个抽象方法的接口
- Runnable
- Callable
- Comparator
- ...
- @FunctionalInterface
- 可引用的包括类的静态方法、成员方法、构造方法
- 接口默认方法(Default Method)
12.2 Functional与Stream API
- 使用Optional代替null
- 标准API的函数接口
- Consumer:一个参数,无返回值
- Function:一个参数,有返回值
- Predicate:一个参数,有返回值,返回值必须是boolean类型的
- Supplier:无参数,有返回值
- Stream与管道
12.3 Lambda与并行处理
动手:
课后练习
返回目录
第十三章 时间与日期
13.1 认识时间与日期
- 时间的度量
- GMT(Greenwich Mean Time)时间:如今不是标准时间
- 世界时(Universal Time,UT):1972年UTC出来以前,UT等价于GMT
- 国际原子时(TAI):秒的定义
- 世界协调时间(Corrdinated Universal Time, UTC): 闰秒
- Unix时间: 1970.1.1 00:00:00开始的秒数
- epoch: java.util.Date epoch毫秒数
- 日历
13.2 认识Date与Calendar
- 时区
- Date与DateFormat
- Date只用来获取epoch毫秒数
- DateFormat来格式化成人类理解的年月日时分秒
- Calendar: 时间的运算
- getInstance(): GregorianCalendar
- getTime()
- get()
- add()
- roll()
- after()
- before()
...
13.3 JDK8新时间日期API
- 机器时间 Instant
- 人类时间(ISO8601 标准)
- LocalDateTime
- LocalDate
- LocalTime
- ZonedDateTime
- OffsetdateTime
- Year
- YearMonth
- Month
- MonthDay
- TemporalAmount
- TemporalUnit
- TemporalAccessor
- Chronology
动手:
- 编辑输入、编译、运行相关代码,并思考相关问题,会调试就更好了(参考「遇到问题为何应该本身动手」)
- 很多都是代码段,本身新建一个
TestJavaTime.java
的类,把代码段输入进行测试
- p429 DateDemo.java: Date类测试
- 研究Date类会发现大多方法都Deprecated了,掌握这个例子就够了
- System.currentTimeMillis()的结果与这个例子有联系吗?测试一下
- p430 DateFormatDemo.java: DateFormat类
- 研究一下DateFormat类
- 发现代码中有什么问题了吗?
- p432 SimpleDateFormatDemo.java: 用SimpleDateFormat自定义日期格式
- p432 HowOld.java: 用SimpleDateFormat自定义日期格式
- 如何运行这个程序?
- 如何计算一个程序的运行时间?下面的方法行吗?测试一下。还有其余方法吗?
- Date begin = new Date();
- ...Java Code...
- Date end = new Date();
- long duration = end.getTime() - begin.getTime();
- p435 CalendarUtil.java: Calendar测试
- 为何调用clone()?
- 研究Calendar类
- 研究GregorianCalendar类
- 修改一下代码,计算一下本身的岁数和活了多少天,结果准确吗?为何?
- p436 TimeZoneDemo.java TimeZoneDemo2.java: TimeZone的测试
- 研究TimeZone类
- 修改代码获取和设置大陆的时区信息
- p439 ZonedDateTimeDemo.java: new Time API测试
- 研究LocalTime类
- 研究LocalDate类
- 研究ZonedDateTime类
- 研究OffsetdateTime类
- p440 MothDemo.java: DateCalendar测试
- 研究Year/Month等类
- 注意getValue()和oridinal的区别
- p442 HowOld2.java:
课后练习
相关连接
返回目录
第十四章 NIO与NIO2
- NIO(New IO)-from JDK1.4
- NIO2 -from Java SE 7
14.1 认识NIO
- Channel: 衔接数据节点(与IO中的流对比)
- ReadableByteChannel
- WritableByteChannel
- Buffer: 块操做
- clear
- flip
- rewind
- mark
- reset
- remaining
14.2 NIO2文件系统
- java。nio.file
- java.nio.file.atribute
- java.nio.file.spi
动手:
课后练习
相关连接
拓展
返回目录
第十五章 通用API
15.1 通用API
- 日志: 日志对信息安全意义重大,审计、取证、入侵检测等都会用到日志信息
- 日志API
- Logger: 注意没法使用构造方法生成Logger对象
- Logger logger = Logger.getLogger("xxx");
- getLevel
- setLevel
- Level
- Handler:输出介质
- MemoryHandler
- StreamHandler
- ConsoleHandler: SimpleFormatter
- FileHandler:XMLFormatter
- SocketHandler
- Formatter: 格式化
- Filter: 过滤
15.2 国际化基础
15.4 JDK8 API加强功能
动手:
课后练习
相关连接
拓展
返回目录
第十六章 整合数据库
MySQL建议安装XAMPP,参考「程序开发与信息安全工具箱」。若是下载的是Portable版的,解压后注意先运行一下setup_xampp.bat,使用软件时读读readme 会解决很多问题。
16.1 JDBC入门
16.2 JDBC进阶
动手:
use demo;
CREATE TABLE t_message (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(20) NOT NULL,
email CHAR(40),
msg TEXT NOT NULL
) CHARSET=UTF8;
+ [下载](http://dev.mysql.com/downloads/connector/j/)并在IDEA中配置驱动
课后练习
拓展
返回目录
第十七章 反射与类加载器
17.1 运用反射
17.2 了解加载器
动手:
返回目录
第十八章 自定义泛型、枚举与注释
18.1 自定义泛型
18.2 自定义枚举
18.3 关于注解
动手:
相关连接
补充:网络编程
1.
返回目录
补充:Java与安全
返回目录
补充:Android开发基础
返回目录
术语对照
Access |
访问 |
存取 |
Annotation |
注解 |
标注 |
Back Refererence |
反向引用 |
回头参考 |
Class |
类 |
类别 |
Class File |
类文件 |
位码文档 |
Collection |
集合 |
收集 |
Dead Lock |
死锁 |
死结 |
Comment |
注释 |
批注 |
Config |
配置 |
组态 |
Default |
默认 |
预设 |
Exception |
异常 |
例外 |
File |
文件 |
文档 |
Flag |
标记 |
旗标 |
implement |
实现 |
操做 |
Interface |
接口 |
界面 |
Level |
级别 |
层级 |
Method Signature |
方法签名 |
方法签署 |
Method Reference |
方法引用 |
方法参考 |
Overflow |
溢出 |
溢值 |
Override |
覆盖 |
从新定义 |
Parameter |
参数 |
自变量 |
Priority |
优先级 |
优先权 |
Race Condition |
竞态条件 |
竞速状况 |
Round-Robin |
轮询 |
输流执行 |
Row |
行 |
列(错误?) |
Reference |
引用 |
参考 |
Regular Expression |
正则表达式 |
规则表示式 |
Scheduler |
调度程序 |
排班器 |
Source Code |
源码 |
原始码 |
Statement |
语句 |
描述 |
Stream |
流 |
串流 |
返回目录
参考资料
欢迎关注“rocedu”微信公众号(手机上长按二维码)
作中教,作中学,实践中共同进步!
若是你以为本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”