《Java程序设计与数据结构教程(第二版)》学习指导
目录
- 图书简况
- 学习指导
- 第一章 绪论
- 第二章 数据和表达式
- 第三章 使用类和对象
- 第四章 条件和循环
- 第五章 编写类
- 第六章 图形用户界面
- 第七章 数组
- 第八章 继承
- 第九章 多态
- 第十章 异常
- 第十一章 递归
- 第十二章 算法分析
- 第十三章 查找与排序
- 第十四章 栈
- 第十五章 队列
- 第十六章 树
- 第十七章 二叉排序树
- 第十八章 堆和优先队列
- 第十九章 图
- 第二十章 哈希算法
- 第二十一章 数据库
- 补充:Java I/O
- 补充:Java 多线程
- 补充:Java网络编程
- 补充:Java安全
- 补充:Android开发
图书简况
Java程序设计与数据结构教程(第二版) (Java Foundations,官网)是我们《程序设计与数据结构》 课程的教材。本书颇具匠心地将程序设计、数据结构等相关课程内容有机地包含在一本书中,解决了这两门专业基础课不能很好地衔接的问题。本书将重点放在软件开发实践方面,使用数据结构的内容作为问题导引,在介绍经典算法的同时还介绍了如何用所学知识来解决实际问题。
需要说明的是本书英文版已经出了第三版,希望大家能参考学习。
这本书的内容来自作者John Lewis的另外两本书: Java程序设计教程(Java Software Solutions,官网)和Java软件结构与数据结构(Java Software Structures,官网)。这两本书在学习也是重要的学习参考。
考虑到大家没有上过《计算机导论》课程,推荐John Lewis参与编写的一本计算机科学概论(Computer Science Illuminated)作为学习参考,这本书用洋葱结构类比计算机结构,结构包含信息层、硬件层、程序设计层、操作系统层、应用程序层和通信层,基于洋葱结构深入剖析了计算系统的每个分层,然后讨论了计算的限制。书中还穿插了大量的人物传记、历史点评、道德问题和新的技术发展信息,有助于大家进一步了解计算机科学。
教材导读
Windows下Java开发环境,对于初学者推荐「JDK + Vim + PowerCMD」。如果感觉学Vim有点困难,初期可以使用「JDK + Atom + PowerCMD」。
Windows学习Java程序设计,要先掌握几个常用的DOS命令,参考Java程序设计的DOS命令基础进行学习。
Linux下Java开发环境,对于初学者推荐使用「Git+JDK+Vim」.在Ubuntu中的安装命令git,vim是:
sudo apt-get install git
sudo apt-get install vim
Linux 版JDK下载后,使用tar -xzvf jdk-8u121-linux-x64.tar.gz; mv jdk-8u121 ~/jdk
进行解压,然后通过vi .bashrc
添加下面几行设置环境变量:
export JAVA_HOME=~/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
如果你用的是MacBook的macOS操作系统,就不用安装Ubuntu虚拟机了,把macOS当Linux用就行了。
对于IDE(Integrated Development Environment,集成开发环境),图书上使用的是NetBeans,考虑到我们课程会涉及到Android开发,而用于Android开发的IDE Android Studio(CN)是在Intellij IDEA上构建的,所以我们上课推荐的IDE是Intellij IDEA。
Intellij IDEA是收费软件,但对学生免费,可以到这里申请免费使用。
这里有IDEA的使用教程,包括不少视频教程。IDEA的使用过程中要慢慢掌握常用的快捷键(哪个常用就刻意记忆一下,参考十大Intellij IDEA快捷键).IDEA的快捷键如下图所示:
其他工具和教程参考「程序开发与信息安全工具箱」。
课程相关信息参考「《Java程序设计》 课程教学」。
相关链接
注意,这些代码都要求同学们自己一行一行的输入,运行,调试;提供下载链接主要是方便在遇到一些自己找不到的错误时对照用,千万不要把代码拷贝过去编译运行一下就完了,这样基本上什么也学不到!!!
参考代码驱动的程序设计学习中的「git的安装测试」部分,建立与教材配套的目录结构,目录要体现出自己学号姓名
,如下图所示:
第一章 绪论
本章教学目标
- 了解Java程序设计语言
- 了解程序编译运行的步骤
- 理解问题求解的一般方法
- 了解软件开发的一般过程
- 了解面向对象技术相关概念
Java程序设计语言
-
Java平台:
- Java SE
- Java EE
- Java ME
-
类定义: public class XXX{}, 一定存为XXX.java
-
main方法的定义是固定的:
public static void main(String [] args){}
-
Java中有三种注释:
//单行注释
/*
多
行
注
释
*/
/**
文
档
注
释
*/
-
Java注释通常要用完整的句子来写,要体现意图,说明为什么这么做,而不要说如何做的,下图是注释的一个反例,不要注释明显的东西:
-
文档注释结合javadoc工具使用,如何写参考How to Write Doc Comments for the Javadoc Tool.也可以参考这个文档。教材附录I中也有相关内容。
-
标识符和保留字
- 图1.1中的Java保留字不用死记硬背,在学习过程中逐渐通过理解和应用进行记忆
- Java中标识符是大小写敏感的
- Java标识符命名的规则
- 主要作为包、类、接口、成员方法、成员变量、常量、局部变量与参数等程序元素的名称
- Java语言规定:标识符由字母、数字、下划线、$组成,第一个字符必须是字母,其字符序列的长度不限,但不允许与Java关键字(保留字)、布尔类型值(true、false)和空值(null)相同
- 标识符中最好不使用货币符($),因为这些符号常被用于内部处理
- 包、类、变量、方法等命名:要体现各自的含义
- 包、类、变量用名词
- 方法名用动宾
- 包名全部小写:io,awt
- 类名第一个字母要大写:HelloWorldApp
- 变量名第一个字母要小写:userName
- 方法名第一个字母要小写:setName
- 标识符的长度“min-length && max-information”
- Maxval PK maxValueUntilOverflow:太长也不好,3-5个单词
- 去元音法则(慎用,只用约定俗成的)
- returnValue->rtnVal
- message->msg
- 全局变量用具有描述性的名字,局部变量用短名字:单字符的名字,常见的如i,j,k等,作局部变量
- 标识符应当直观且可以拼读,可望文知意,不必进行“解码”
- 采用英文单词或其组合,便于记忆和阅读
- 切忌使用汉语拼音来命名
- 用词要准确:例如“当前值”,CurrentValue不要写成NowValue,更不要写成dqz(当前值)
-
空白
- 写代码不是写给机器的,是写给人(程序员,甚至你自己)的,要注意可读性
- 写代码要想写书一样,分章/节/段/句
- 对比一下程序1.1, 1.2, 1.3, 这三个程序都可以编译,运行,只有1.1的可读性最好
-
推荐图书
-
代码规范
程序开发
-
冯氏结构与存储程序
-
冯·诺依曼体系结构的要点包括:
- 计算机硬件应由运算器、存储器、控制器、输入设备、输出设备5大基本类型部件组成;
- 计算机内部采用二进制来表示指令和数据;
- 将编好的程序和数据先存入存储器中,然后再启动计算机工作,这就是存储程序的基本含义。
-
计算机硬件的基础是CPU,它与内存和输入输出设备时行交互,从输入设备接收数据,向输出设备发送数据。CPU由运算器(算术逻辑单元ALU),控制器和一些寄存器组成。有一个非常重要的寄存器中叫程序计数器(Programming Counter,PC),在IA32中是EIP,指示将要执行的下一条指令在存储器中的地址。C/C++程序员可以认为EIP是一个指针,它总是指向内存的某一块区域,我们把这块区域称为代码段。CPU就是从EIP指向的那个地址取过来一条指令执行,执行完了之后IP会自加一,执行下一条指令,然后再取下一条指令执行,像贪吃蛇一样总是在内存里边吃指令。
-
CPU和内存和I/O设备通过总线相连接。内存中存放指令和数据。指令和数据的功能和处理上是不同的,但都可以用二进制的方式存储在内存中。
-
冯·诺依曼体系结构的核心是「存储程序」。冯诺依曼体系结构就是存储程序计算机。
- 上图说明了“自动化”的要义
-
-
程序设计语言
- 机器语言: 不同的CPU不同
- 汇编语言:机器语言的助记符
- 高级语言:可移植
- 第四代语言
-
编辑器/编译程序和解释程序
- Linux 命令行中可以使用
od -tx1c src/01intro/Lincoln.java
查看源代码的存储情况 - 理解图1.4, 理解Java 程序「一次编译,到处运行」主要是有了 字节码和JVM
- Linux 命令行中可以使用
-
开发环境
- IDE: Intellj IDEA, 参考Intellj IDEA 简易教程.
-
语法和语义
- 语法规定程序的格式。不合语法的程序是无法编译的。
- 语义规定程序语句的意义。
-
错误
- 三类错误
- 编译时错误:语法错误,初学者易犯
- 运行时错误:异常处理
- 逻辑错误:要学会通过调试(debug)来定位错误(Java中使用JDB)
- 自顶向下进行调试
- 学会设置断点(行断点/函数断点/条件断点/临时断点)
- 学会单步运行
- 循环的调试
- 函数的调试
- 二分法定位错误
- 三类错误
问题求解
- 软件开发的核心是问题求解,编写程序是为了解决问题。解决问题的能力是一切工作的根本。
- 一般步骤
- 理解问题
- 设计方案
- 考虑方案的选择并优化方案
- 实现方案
- 测试方案并修改存在的问题
软件开发行为
-
软件开发
- 建立需求:做什么?
- 生成设计:如何做?
- 实现设计:设计到代码
- 测试:做对没?
-
三种代码
- 伪代码
- 产品代码
- 测试代码
-
- 程序 = 算法 + 数据结构
- 软件 = 程序 + 软件工程
- 软件企业 = 软件 + 商业模式
-
推荐图书:
面向对象程序设计
-
概念:
- 对象
- 类
- 属性
- 方法
-
面向对象三要素:封装,继承,多态
-
继承可以复用,更重要的是用继承实现多态;封装是继承的基础;继承是多态的基础。
-
推荐图书
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
- SR1.8:
- OO基本元素:对象,类,封装,继承,多态;继承可以复用,更重要的是用继承实现多态;封装是继承的基础;继承是多态的基础。
练习
- 会在每周考试中体现
程序设计项目
- 至少完成 PP1.1, PP1.2
动手实践
- p2 Linconln.java
-
按前面的目录结构,我的工作目录如下(你要用自己的学号姓名信息建目录)
-
代码编辑我们推荐使用Vim或Atom,Vim学习参考做中学之Vim实践教程,如上图,我们使用
vim src/01intro/Lincoln.java
来编辑Lincoln.java,注意类名和文件名要一致,注间1与l的区别:
-
//********************************************************************
// Lincoln.java Java Foundations
//
// Demonstrates the basic structure of a Java application.
//********************************************************************
public class Lincoln{
//-----------------------------------------------------------------
// Prints a presidential quote.
//-----------------------------------------------------------------
public static void main (String[] args){
System.out.println ("A quote by Abraham Lincoln:");
System.out.println ("Whatever you are, be a good one.");
}
}
- 教材上的代码风格值得学习,代码学习如何进行注释,类定义,方法定义。
- 代码编译命令:`javac src/01intro/Lincoln.java -d ./bin`
- 代码运行命令:`cd bin;java Lincoln;cd..`; 如下图:
相关链接
- Java8 规范
- Java 官网
- OpenJDK 官网
- JDK下载
- Java SE - Change in Version Numbering Scheme
- Java8 Documents
- Java8 API
- The Java Tutorial
拓展
- 计算机科学概论(Computer Science Illuminated)第一部分,第三部分
返回目录
第二章 数据和表达式
字符串
-
print, println, printf
- printf见拓展内容
- println == printf(" ")
-
帮助文档的使用
-
字符串连接 +
-
转义字符 ''
变量和赋值
- 变量:变量名和变量值 与内存的对应
- 赋值
- 常量:final
- 全大写
- DRY
- 消除魔数(Magic Number)
基本数据类型
-
8 种基本类型(byte,short,int,long,float,double,boolean,char)
- 6种数字类型(byte,short,int,long,float,double)
- 4种整数类型(byte,short,int,long),
- char占两个字节
- boolean只有true和false
-
注意取值范围和溢出(图2.2)
-
字面量
- 23 默认是int 类型
- 23l和23L是long类型(注意l和1的区别,long类型只用L缀)
- 23.0 默认是double类型
- 23.0f和23.0F是float类型
表达式
-
算术运算
- +
- -
- *
- /
- %: 密码学上常用
-
关系运算:注意不要对浮点数进行相等性运算,可以试试
1.0-0.7==0.3
?- >、>=、<、<=、==、!=
- Conditional Operator: 条件表达式 ? 成立时返回值:失败时返回值
-
逻辑运算:运算结果是boolean值:true Or false
- 与(&&)
- 或(||)
- 非(!)
-
位运算位运算(P486附录D.1):运算结果为位串(位向量),常用于掩码(Mask)运算
- 与(&):全1为1,有0则0
- 或(|):全0为0,有1则1
- 非(~):书上说是
补码
,按我们的习惯应该是反码
- 异或(^):相同为0,不同为1
- 左移(<<):最右补0
- 算术右移(>>):右移后,正数最高位补0,负数最高位补1
- 逻辑右移(>>>):右移后,最高位总是补0
-
自增,自减(上下两行的区别)
- i++,i--
- ++i,--i
-
赋值
- =
- +=, -=, *=, /=, %=,&=, |=, ^=, <<=, >>=
-
运算符优先级(不用刻意记)
- 除了先乘除后加减,其他的用()
- 注意()的作用
数据转换
- 加宽和缩窄
- 缩窄要进行强制类型转换
- 三种转换
- 赋值转换
- 提升
- 强制类型转换
读输入数据
- 标准输入System.in
- 标准输入System.out
- 输出
- System.out.print
- System.out.println
- System.out.printf
- 输入
- Scanner
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP2.2, PP2.4, PP2.6, PP2.80, PP2.10
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch02Test.java
建个测试类
public class Ch02Test {
public static void main(String [] args) {
}
}
- p21 Countdown.java
- 加点代码用用printf,与print,println对比一下
- p22 Facts.java
- p23 Additions.java
- p24 Roses.java
- p25 Pianokeys.java
- p26 Geometry.java
- p33 TempConverter.java
- p38 Echo.java
- 加点代码看看8种基本类型都怎么输入
- p39 GasMileage.java
- 本章代码不少数是固定的,如何修改一下上面的代码,让用户进行输入
相关链接
拓展
- printf:教材3.6节
- 计算机科学概论(Computer Science Illuminated)第二部分
第三章 使用类和对象
创建对象
- 基本数据类型与引用类型(类类型,自定义类型)
- Java API: p49类库,前面第一章开发环境的讲解
- 开发程序时类库非常有用
- 学习Java,很大程度上要学习Java的API
- new:返回指向新建对象的引用
-
String s = new String();
- s是引用,在栈上
- new String()在堆上生成对象
-
别名:引用保存的内存地址
- 多个引用变量可以指向同一个对象
-
String 类
-
创建字符串最常用的方式不是使用new,而是用字符串赋值
-
参考积极主动敲代码,使用Junit学习Java程序设计:常看直到掌握学习方法
-
什么是方法?参考P112 方法的解析
- 方法调用: 对象名.方法名(参数)
- 方法需要对象调用,不同的对象决定着同一方法调用的不同结果
包
- 大型项目:子系统
- Java API是按包分组的,p50图3.2
- 重点:java.lang,java.util,java.math.java.io,java.net,java.sql,java.security,java.text...
- package与import
- 编译运行
- javac -d . XXX.java
- java xx.xxx.XXX
- java.lang包中的类自动import到每个程序中
- 编译运行
Random类
- 密码学中意义重大
- 伪随机数生成器执行复杂的计算产生随机数
- Math.random()更方便
Math类
- Math类中的方法都是static的可以用Math.XXX()来调用。
格式化输出
- NumberFormat
- DecimalFormat
- print,println,printf
枚举类型
- enum与final
- 枚举是类型安全的,可以保证不会使用非法的值
- 枚举序数从0开始
包装类
- 基本类型与引用类型
- 包装类是一种特殊的基本类型,能够按对象的方式处理基本类型。
- p60 图3.7
- 字符串与数字的转换
- String.parse()
- “”+20
- 数字解析:Integer.parseInt(“20")
- 自动包装(autoboxing)与拆包(unboxing)
- 自动包装提供基本数据类型与对应包装类之间的转换
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP3.1,pp3.3,pp3.5
- 要有一个结对学习的伙伴
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第三章可以通过
vi Ch03Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
- p48 StringMutation.java
- 参考积极主动敲代码,使用Junit学习Java程序设计
- 学习String类的帮助文档
- 参考帮助文档加点代码
- 调用一些新方法
- p51 RandomNumbers.java:Random类
- 学习Random类的帮助文档
- 修改代码生成自己想要的范围
- 密码学中常用
- p53 Quadratic.java:Math类
- 学习Math类的帮助文档
- 测试一些新的方法
- p55 Purchase.java: NumberFormat类
- 注意这Numberformat类生成对象没用使用new,使用了工厂方法
- 定义常量消除魔数(magic numbers):DRY
- p56 CircleStats.java:DecimalFormat类
- p58 IceCream.java: enum
- enum与final
相关链接
- 学习Java要学会使用Java API
- 在Windows下一定要下载CHM格式的Java API,这个版本具有检索功能,使用非常方便
- macOS中下载Dash
拓展
- 参考「Java:String、StringBuffer和StringBuilder的区别 」,特别是其中的「使用策略」
- 参考「java中String、StringBuffer、StringBuilder的区别」
第四章 条件和循环
布尔表达式
- 控制流:顺序(存储程序)/分支(条件语句,特殊情况)/循环(自动化)
- 分支和循环:依赖布尔表达式
- 相等与关系运算
- 主要用于整数(byte,short,int,long)
- 结果是boolean类型
- 注意优先级,善用“()”
- 逻辑运算符
- 理解真值表
- 理解短路
- 所有复杂的逻辑表达式都可以用“与或非”来表达(最大项,最小项)
if语句
- Linux 下可以用dia(sudo apt-get install dia) 来画流程图
- 缩进有利于提高代码可读性(vim中 :set ai)
- if
- if...else
- 块语句
- 完成复杂功能
- 缩进不能代替{}
- 三元条件运算符
- if...else if ... esle
- else的就近原则
数据比较
- 浮点数的比较:使用公差
- 字符比较:Unicode顺序
- ASCII表中的大小写字母,数字要熟记编码
- 对角比较:equals
switch语句
- 在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7之后,支持String
- switch与嵌套if的等价转换
- MESE原则 (Mutually Exclusive Collectively Exhaustive,“相互独立,完全穷尽”)
- break
- default
while语句
- 循环不变式
- 避免死循环(Ctrl+C退出)
- 嵌套的循环
- break可以跳出多重循环
- break与continue的区别
迭代器
- Java Collection中会细讲
- 此处了解就行
do 语句
- do ... while
for 语句
- 与while等价
- for(;;)死循环
- for-each了解
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP4.1, PP4.8, PP4.15
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第四章可以通过
vi Ch04Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
-
p68 Age.java: if 语句
- 定义常量MINOR,不要使用magic number
- 可以把代码下面的内容输入测试一下
-
p70 Wages.java: if...else
- MESE
- if 和 else下面的代码换换位置,if语句如何改写?
-
P71 Guessing.java: 块语句
-
p74 MinofThree.java:嵌套的if
- 临时变量的min的使用看懂,能力会大大增强
- 尝试写一段代码把int a; int b;的值交换一下
-
p78 GradeReport.java: switch
- switch 和if 等价,尝试用if改写本代码
- 尝试用switch...case改写上面的代码
-
p80 Average.java: while
- Scanner中nextInt后不能紧接着nextLine
-
p82 WinPercentage.java :输入验证
- 代码的健壮性(Robust)
- 错误处理在编程中很重要
- 引发安全问题的错误代码叫漏洞
-
p84 PalindromTester.java:嵌套的循环
- 处理复杂情况
- 尝试输入一个非常长的字符串,多长程序会崩溃?
-
p87 URLDissector.java: Scanner读文件
- 了解一下Linux输入重定向
- 查帮助文档学习File类
- 学习一下Linux下的stat,cat命令
- 深入学习一下 ls -l
-
p90 Reverse.java : do...while
- 用while改写一下本代码,功能不变
- 用for改写一下本代码,功能不变
-
p92 Multiple.java:for
- 用while改写一下本代码,功能不变
-
p93 Multiple.java:嵌套for
- 用while改写一下本代码,功能不变
相关链接
拓展
- 卡诺图
- 查表法
第五章 编写类
-
再谈类和对象
- 类:自定义类型
- 类是对象的蓝图
- 对象
- 状态:属性
- 行为:操作
-
类的设计:抽象
- 名词
- 类:复数
- 对象:单数
- 属性:
- 支撑类
- 代码复用:站在前人的肩膀上
- 系统类库
- 开源类库
- 购买
- 职责分配,方法设计
- 动词
- 方法放入哪个类中?
- SRP(单一职责原则)
- 名词
-
类的剖析
- 变量的作用域:程序中能引用变量的区域
- 实例数据的
- UML类图
- 类
- 关联
-
封装
- public ,private
- 可见性在UML中的表达
-
方法的剖析
- 动词
- DRY
- 参数的设计:程序中的变化部分
- 形参
- 实参
- return:返回值
- 局部数据
-
静态类成员
- 类成员
- 类.类成员引用
-
类关系
- 依赖
- 聚合
- UML中的表示
- this
-
方法设计
- 方法的分解
- 参数传递:
- 传值
- 传引用
-
方法重载
- 参数类型与数量
- 不管返回值
-
测试
- 代码评审,走查
- 结对
- 缺陷测试: 质量保证
- 单元测试: 模块测试
- 测试代码不少于产品代码
- 积极主动敲代码,使用JUnit学习Java
- 集成测试:系统大组件的正确性
- 回归测试
- 系统测试:与需求的致性
- alpha 测试
- beta 测试
- TDD:测试驱动开发
- refactor: 重构
- 代码评审,走查
-
调试
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP5.3,PP5.6, PP5.13
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第五章可以通过
vi Ch05Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
-
p103 SnakeEyes.java: 定义测试类
-
p104 Die.java: 定义类
- 以上两个代码要放同一个文件夹下
- 一类一文件
- 三种代码
- 伪代码
- 产品代码
- 测试代码
- javac -d bin src/05class/*.java
- 方法注释
- public String toString()上面加个@Override:自己写的所有的类最好都有toString()方法
- Dia d; Systerm.out.println(d)等价于Systerm.out.println(d.toString())
- PP5.10
- UML建模
-
p109 CountFlips.java: 定义测试类
-
P110 Coin.java: 定义类,访问控制
- 修改代码试试public ,private的不同
- PP5.1
- PP5.2
- PP5.3
- UML建模
-
p113 Transactions.java: 定义测试类
-
p114 Account.java:定义类,方法
- P114输出结果有误
- PP5.12
-
P120 SloganCounter.java: 定义测试类
-
P121 Slogan.java: 定义类,static
- 静态成员能用对象引用吗?
- public static 定义常量
-
P123 RationalTester.java: 定义测试类
-
P124 RationalNumber.java:定义类,有理数
- 注意加减乘除的定义,只有一个参数
-
P129 PigLatin.java:
-
P130 PigLatinTranslator.java
- private 方法
- 方法分解
-
P132 ParameterTest.java: 定义测试类
-
P133 ParameterModifier.java: 定义类
-
P134 Num.java: 工具类
- 函数参数传基本类型和引用类型的不同
- 用JDB跟踪一下
相关链接
拓展
第六章 图形用户界面(自学,不纳入考试)
-
GUI四要素(组件,容器,布局,事件)
- 有哪些组件?
- 有哪些容器?组件要放在容器中
- 有哪些布局?组件要放在容器中的什么位置
- 如何进行事件处理?
-
组件
-
容器
-
布局
-
事件
- 事件处理的四种方式
-
GUI设计
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
相关链接
拓展
第七章 数组
数组容纳相同类型的多个元素,方便我们用循环统一处理。
-
数组元素
- 在内存中如何存放
- Java中数组索引从0开始
-
数组的声明及使用
- Java数组是对象,要用new实例化,new指定大小,之后数组大小不能改变
- int [] arr = new int[11];
- int arr [] = new int[11]
- Java中访数组元素不能越界,用数组的length属性控制
- for each语法
- for( int i : arr) {System.out.pintln(i);} 等价于
- for( int i=0; i<arr.length; i++ ) {System.out.pintln(arr[i]);}
- []的优先级最高
- 第一次声明数组可以使用初值表代替new实例化数组
- int[] scores = {99, 100, 85};
- 数组可以作为方法的参数
- Java数组是对象,要用new实例化,new指定大小,之后数组大小不能改变
-
对象数组
- 对象数组的实例化,只是分配了保存引用的空间,每个元素中保存的对象还必须分别实例化
- String [] words = new String[5]:一个String对象也没有
- 对象数组的实例化,只是分配了保存引用的空间,每个元素中保存的对象还必须分别实例化
-
命令行参数
- args[0]的值是类名
- args是字符串数组
-
变长参数表
- 变长参数必须是方法的最后一个参数
-
二维数组
- 多维数组
- 二维数组是一维数组的数组
- M*N的表 :int[][] arr = new int[M][N];
- 用嵌套循环遍历
- 三维数组是二维数组的数组
- ...
- 二维数组是一维数组的数组
- 锯齿状数组
- 多维数组
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第七章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
-
p204 BasicArray.java : 数组
- 两种for语法
- 尝试修一下代码,用for...each初始化
- 常量定义消除魔数
-
p206 ReverseOrder.java: length
- length的使用
- 尝试打印 numbers[numbers.length]的值
- for中,索引可增可减
-
p207 LetterCount.java: String是字符数组
- 查看API文档,学习String类中的相关方法
- 如何判断一个字符的范围?
- current - 'A' 是干吗的?
- 使用Character类的isUpperCase和isLowerCase方法改写代码
-
p210 Prime.java: 初值表
-
p212 GradeRange.java : 对象数组,测试类
-
p212 Grade.java:
- 自定义类一般都要有toString()
- 用对象初值表初始化对象数组
-
p213 Tunes.java :对象数组,测试类
-
p215 CDCollection.java: 数组管理
-
p216 CD.java
- CDCollection可以用ArrayList替换,改写一下Tunes.java
-
p218 CommandLine.java: args数组
- 期望java CommandLine 1 2 3 输出1,2,3的和,如何改代码?
-
p219 VariableParameters.java: 变长参数,测试类
-
p220 Family.java:
- 变长参数和数组什么关系?
-
p221 TwoDArray.java: 二维数组
- for...each改写代码
-
p222 SodaSurvey.java: 初始值表初始化二维数组
- 不定义常量用for...each写代码可行吗?
拓展
- 学习java.util.Arrays
- 学习java.util.ArrayList
第八章 继承
-
创建子类
-
extends
-
继承的作用之一是代码复用
-
继承建立了ISA关系
- 正方形能继承长方形吗?
-
UML类图中的继承表示
-
proteced
-
super与this
- 常用于调用构造方法
-
Java只支持单继承
-
-
方法的重写(Override)
- 重载与重写的区别
- 子类中的方法与父类一样是重写,可以用@Override从语法上保证
- 子类中的方法与父类参数不一样是重载
- 避免隐藏变量
-
类层次
-
类层次中公共特性放父类中
- Java API学习要明白类层次关系
- 学习从父类学起效率高
-
Object类是所有类的父类
-
toString()
-
equals()
-
hashCode():与equals一起使用
-
-
abstract 与抽象类
- 抽象类表达抽象概念,不能用new实例化
- UML中的抽象类
- 抽象类的子类
- 实现父类的抽象方法变成具体类
- 不实现父类抽象方法仍要用abstract修饰
-
-
可见性
- public protected 包 private 四种访问控制的区别
-
设计继承
- final 禁止继承
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第八章可以通过
vi Ch08Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
-
p229 Words.java: 测试类
-
p230 Book.java: 父类
-
p230 Dictionary.java:子类
- 体会ISA
- UML图在StarUML中画一下
-
p232 Words2.java: 测试类
-
p233 Book2.java: 父类
-
p234 Dictionary2.java:子类
- super
-
p235 Messages.java: 测试类
-
p236 Thought.java: 父类
-
p236 Advice.java:子类
- Override
- Advice dates = new Advice(); 改成 Thought dates = new Advice();结果会怎样?
-
p240 FoodAnalyzer.java : 测试类
-
p241 FoodItem.java:父类
-
p241 Pizza.java:子类
- private
拓展
第九章 多态
- 后绑定
- 多态引用在不同的时候可以指向不同类型的对象
- 用父类声明引用,用子类生成对象,就产生了多态
- 多态引用运行时才将方法调用与它的定义绑定在一起
- 多态引用在不同的时候可以指向不同类型的对象
- 通过继承实现多态
- 引用变量可以指向声明继承于它的任意类的任何对象
- 对象的类型,而不是引用的类型,决定调用是方法的哪个版本
- 接口
- interface,implements 等价于class,extends
- 接口是一组抽象方法,与抽象类一样不能被实例化
- 接口层次
- 接口可以继承接口
- 类可以实现接口,但不能继承接口
- Comparable接口
- compareTo()
- Iterator接口
- hasNext()
- nextZ()
- 通过接口实现多态
- 和class一样,接口可以用来声明对象引用变量
- 接口引用可以指向实现这个接口的任意类的作何对象
- 方法的参数可以是多态的
- 9.4.1不用看
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
-
p248 Firm.java: 测试类
-
p249 Staff.java: 测试类
-
p251 StafMemeber.java:父类
-
p251 Volunteer.java:子类
-
p252 Employee.java:子类
-
p253 Executive.java:子类
-
p253 Hourly.java:子类
- 理解P248的UML图
- 产生多态的是StaffMember中的pay()
- PP9.1
- PP9.2
-
p255 Encryptable.java: 接口
-
p255 Secret.java: 实现接口
-
p257 SecretTest.java: 测试类
- 理解P257 UML 图
- shift是密钥
- message是明文和密文
- PP9.4
拓展
第十章 异常
-
异常处理
- 错误和异常代表不常见的或不正确处理的对象
- 错误(Error)不用捕获
- 处理异常
- 不处理,程序崩溃
- 在异常发生的地方处理
- 在程序的其他地方处理
-
不捕获异常
- 程序中出现异常不捕获异常,程序会崩溃
- 抛出异常时输出的消息提供方法调用栈的的轨迹
- 调用栈跟踪(call stack trace)
- 第一行给出原因,异常类型
- 栈的第一行给出产生异常的代码(这个般就是产生异常的原因)
-
try-catch 语句
- Java中把正常流程放try块中,错误(异常)处理放catch块中
- 每个catch 子句处理try块中可能抛出的一种特定类型的异常
- API文档中带throws的必须使用try...catch,如下图
- 注意多个catch一定把父类放后面处理
- finally:总会执行,用于资源管理
-
异常传播
- 如果没有在异常发生处捕获及处理,异常会被传播给调用的方法
- catch or throw?(如果要产生异常,程序员必须仔细考虑如何及在哪里处理异常)
- throws:自己无法处理,用在方法声明
- throw:方法中抛出Checked Exception,方法声明中必须有throws
-
异常类的层次
- Error及其子类写程序不用处理,最多留个日志
- Java异常处理是要处理
Exception
类及其子类(Checked Exception)RuntimeException
及其子类也不用处理(Unchecked Exception),是免检异常- 产生
RuntimeException
的问题在调用代码 - 参考Design by Contract (DBC) 契约式设计
- Multi-catch:类之间不能有继承关系
- 学习Java API时一定对上层的类好好研究,学习,再学习和应用子类时就比较容易了
- 自定义异常
-
I/O异常
- 先学习I/O
- 几乎所有的IO API都可能抛出异常
- 流是字节序列
- 字节流
- 字符流
- 标准流
- System.in
- System.out
- System.err
- 先学习I/O
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
-
p265 Zero.java: 除0异常
- 用try...catch 修改一下代码,保证程序不崩溃,最后一行能打印出来
-
p267 ProductCodes.java
- 查找API文档,理解StringIndexOutOfBoundsException, NumberFormExcetion产生的原因
- 代码中哪些方法会导致上面两个异常的产生
- 理解substring两个参数的含义
-
p269 Propagation.java: 测试类
-
p269 ExceptionScope.java: 异常传播
- 先想一下运行结果,再跟实际比较一下
- level3 ->level2 ->level1才处理
- 理解栈调用跟踪的信息
-
p271 CreatingExceptions.java: 自定义异常的测试类
-
p272 OutOfRangeExcepton.java: 自定义异常类
- 自定义异常用throw抛出
- 什么时候使用异常,要好好思考
-
p274 TestData.java: IO异常
- 写入文本文件
拓展
第十一章 递归
- 递归思想
- 递归程序设计
- 使用递归
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十二章 算法分析
- 算法效率
- 增长函数和大O符号
- 比较增长函数
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十三章 查找与排序
- 查找
- 排序
- 分析查找和排序算法
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十四章 栈
- 集合的介绍
- 栈集合
- 继承,多态和泛型
- 栈的ADT
- 使用栈:计算后缀表达式
- 异常
- 使用数组实现栈
- ArrayStack类
- 将引用作为链
- 管理链表
- 没有链的元素
- 使用链实现栈
- 使用java.util.Stack 类实现栈
- 包
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十五章 队列
- 队列ADT
- 使用队列:编码K值
- 使用队列:模拟票务柜台
- 实现队列:使用链表
- 实现队列:使用数组
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十六章 树
- 树
- 树的遍历
- 树的实现策略
- 二叉树的实现
- 决策树
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十七章 二叉排序树
- 二叉查找树
- 二叉查找树的实现
- 平衡二叉查找树
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十八章 堆和优先队列
- 堆
- 堆的实现
- 堆排序
- 优先队列
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第十九章 图
- 无向图
- 有向图
- 带权图
- 常用的图算法
- 图的实现策略
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第二十章 哈希算法
- 哈希方法
- 哈希函数
- 解决冲突
- 从哈希表中删除元素
- Java Collection API中的哈希表
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
第二十一章 数据库
- 数据库介绍
- 建立与数据库的链接
- 创建并修改数据库表
- 查询数据库
- 插入/查看及更新数据
- 删除数据和数据库表
自测题
- 练习一下,并对照答案查漏补缺
- 每周测试会有题目出现
练习
- 会在每周考试中体现
程序设计项目
- 至少完成PP
- 自己写的代码找一个同学用用,看看能发现什么问题
动手实践
- 每章有一些代码段,同学们可以自己建一个测试类把书上的代码段输入到main方法来运行一下这些代码,比如第二章可以通过
vi Ch07Test.java
建个测试类
public class Ch03Test {
public static void main(String [] args) {
}
}
相关链接
拓展
补充:Java I/O
补充:Java 多线程
补充:Java网络编程
补充:Java安全
补充:Android开发
参考资料
欢迎关注“rocedu”微信公众号(手机上长按二维码)
做中教,做中学,实践中共同进步!
-
版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”