《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 gitsudo apt-get install vim
Linux 版JDK下载后,使用tar -xzvf jdk-8u121-linux-x64.tar.gz; mv jdk-8u121 ~/jdk
进行解压,然后通过vi .bashrc
添加下面几行设置环境变量:
export JAVA_HOME=~/jdkexport PATH=$JAVA_HOME/bin:$PATHexport 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程序设计》 课程教学」。
相关链接
图书范例下载: Java程序设计与数据结构教程(第二版)源码Java程序设计教程(第八版)源码Java软件结构与数据结构注意,这些代码都要求同学们自己一行一行的输入,运行,调试;提供下载链接主要是方便在遇到一些自己找不到的错误时对照用,千万不要把代码拷贝过去编译运行一下就完了,这样基本上什么也学不到!!!
参考代码驱动的程序设计学习中的「git的安装测试」部分,建立与教材配套的目录结构,目录要体现出自己学号姓名
,如下图所示:
Java 认证
返回目录
第一章 绪论
本章教学目标
了解Java程序设计语言了解程序编译运行的步骤理解问题求解的一般方法了解软件开发的一般过程了解面向对象技术相关概念Java程序设计语言
Java平台: Java SEJava EEJava ME类定义: public class XXX{}, 一定存为XXX.javamain方法的定义是固定的: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->rtnValmessage->msg全局变量用具有描述性的名字,局部变量用短名字:单字符的名字,常见的如i,j,k等,作局部变量标识符应当直观且可以拼读,可望文知意,不必进行“解码”采用英文单词或其组合,便于记忆和阅读切忌使用汉语拼音来命名用词要准确:例如“当前值”,CurrentValue不要写成NowValue,更不要写成dqz(当前值)空白 写代码不是写给机器的,是写给人(程序员,甚至你自己)的,要注意可读性写代码要想写书一样,分章/节/段/句
对比一下程序1.1, 1.2, 1.3, 这三个程序都可以编译,运行,只有1.1的可读性最好推荐图书 程序设计实践(The Practice of Programming)程序员修炼之道(The Pragmatic Programmer)代码整洁之道(Clean Code)实现模式 (Implementation Patterns)编写可读代码的艺术(The Art of Readable Code)代码规范 阿里集团Java 代码规约Google Java 代码规范Oracle Java代码规范
程序开发
冯氏结构与存储程序 冯·诺依曼体系结构的要点包括: 计算机硬件应由运算器、存储器、控制器、输入设备、输出设备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开发环境 JDK下载地址在这, 相关文档中说明了JDK,JRE,JVM的区别:IDE: Intellj IDEA, 参考Intellj IDEA 简易教程.语法和语义 语法规定程序的格式。不合语法的程序是无法编译的。语义规定程序语句的意义。错误 三类错误 编译时错误:语法错误,初学者易犯运行时错误:异常处理逻辑错误:要学会通过调试(debug)来定位错误(Java中使用JDB) 自顶向下进行调试学会设置断点(行断点/函数断点/条件断点/临时断点)学会单步运行循环的调试函数的调试二分法定位错误
问题求解
软件开发的核心是问题求解,编写程序是为了解决问题。解决问题的能力是一切工作的根本。一般步骤 理解问题设计方案考虑方案的选择并优化方案实现方案测试方案并修改存在的问题软件开发行为
软件开发 建立需求:做什么?生成设计:如何做?实现设计:设计到代码测试:做对没?三种代码 伪代码产品代码测试代码三个公式 程序 = 算法 + 数据结构软件 = 程序 + 软件工程软件企业 = 软件 + 商业模式推荐图书: 构建之法(电子版)代码大全(Code Complete)代码阅读面向对象程序设计
概念: 对象类属性方法面向对象三要素:封装,继承,多态继承可以复用,更重要的是用继承实现多态;封装是继承的基础;继承是多态的基础。
推荐图书 UML精粹(UML Distilled)
自测题
练习一下,并对照答案查漏补缺每周测试会有题目出现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 SchemeJava8 DocumentsJava8 APIThe Java Tutorial拓展
计算机科学概论(Computer Science Illuminated)第一部分,第三部分返回目录
第二章 数据和表达式
字符串
print, println, printf printf见拓展内容println == printf("\n")帮助文档的使用 参考积极主动敲代码,使用JUnit学习Java字符串连接 +
转义字符 ''
变量和赋值
变量:变量名和变量值 与内存的对应赋值常量: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) 整数是补码表示的(负数取反加一)浮点数参考IEEE754标准:谁用Java写个转换器有加分 floatdouble另一个计算器表示过程字面量 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.printSystem.out.printlnSystem.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.javap23 Additions.javap24 Roses.javap25 Pianokeys.javap26 Geometry.javap33 TempConverter.javap38 Echo.java 加点代码看看8种基本类型都怎么输入p39 GasMileage.java
本章代码不少数是固定的,如何修改一下上面的代码,让用户进行输入
相关链接
拓展
printf:教材3.6节计算机科学概论(Computer Science Illuminated)第二部分返回目录
第三章 使用类和对象
创建对象
基本数据类型与引用类型(类类型,自定义类型)Java API: p49类库,前面第一章开发环境的讲解 开发程序时类库非常有用学习Java,很大程度上要学习Java的APInew:返回指向新建对象的引用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.sql,java.security,java.text...package与import 编译运行 javac -d . XXX.javajava xx.xxx.XXXjava.lang包中的类自动import到每个程序中
Random类
密码学中意义重大伪随机数生成器执行复杂的计算产生随机数Math.random()更方便
Math类
Math类中的方法都是static的可以用Math.XXX()来调用。
格式化输出
NumberFormatDecimalFormatprint,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):DRYp56 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)ifif...else块语句 完成复杂功能缩进不能代替{}三元条件运算符if...else if ... esle else的就近原则数据比较
浮点数的比较:使用公差字符比较:Unicode顺序 ASCII表中的大小写字母,数字要熟记编码对角比较:equals
switch语句
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7之后,支持Stringswitch与嵌套if的等价转换 MESE原则 (Mutually Exclusive Collectively Exhaustive,“相互独立,完全穷尽”)breakdefault
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 MESEif 和 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后不能紧接着nextLinep82 WinPercentage.java :输入验证 代码的健壮性(Robust)错误处理在编程中很重要引发安全问题的错误代码叫漏洞p84 PalindromTester.java:嵌套的循环 处理复杂情况尝试输入一个非常长的字符串,多长程序会崩溃?p87 URLDissector.java: Scanner读文件 了解一下Linux输入重定向查帮助文档学习File类学习一下Linux下的stat,cat命令深入学习一下 ls -lp90 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: 重构调试 使用JDB调试Java程序IDEA中调试自测题
练习一下,并对照答案查漏补缺每周测试会有题目出现练习
会在每周考试中体现程序设计项目
至少完成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.10UML建模p109 CountFlips.java: 定义测试类P110 Coin.java: 定义类,访问控制 修改代码试试public ,private的不同PP5.1PP5.2PP5.3UML建模p113 Transactions.java: 定义测试类p114 Account.java:定义类,方法 P114输出结果有误PP5.12P120 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跟踪一下
相关链接
拓展
面向对象设计的SOLID原则返回目录
第六章 图形用户界面(自学,不纳入考试)
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};数组可以作为方法的参数对象数组 对象数组的实例化,只是分配了保存引用的空间,每个元素中保存的对象还必须分别实例化 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.javap218 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:子类 体会ISAUML图在StarUML中画一下p232 Words2.java: 测试类p233 Book2.java: 父类p234 Dictionary2.java:子类 superp235 Messages.java: 测试类p236 Thought.java: 父类p236 Advice.java:子类 OverrideAdvice dates = new Advice(); 改成 Thought dates = new Advice();结果会怎样?p240 FoodAnalyzer.java : 测试类p241 FoodItem.java:父类p241 Pizza.java:子类 private
拓展
如何重写hashCode()和equals()方法返回目录
第九章 多态
后绑定 多态引用在不同的时候可以指向不同类型的对象 用父类声明引用,用子类生成对象,就产生了多态多态引用运行时才将方法调用与它的定义绑定在一起通过继承实现多态 引用变量可以指向声明继承于它的任意类的任何对象对象的类型,而不是引用的类型,决定调用是方法的哪个版本接口 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.1PP9.2p255 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.inSystem.outSystem.err
自测题
练习一下,并对照答案查漏补缺每周测试会有题目出现
练习
会在每周考试中体现
程序设计项目
至少完成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开发
返回目录
参考资料
Java程序设计与数据结构教程(第二版) (Java Foundations,官网)
《Java学习笔记(第8版)》学习指导
程序设计实践(The Practice of Programming)
代码大全(Code Complete)
欢迎关注“rocedu”微信公众号(手机上长按二维码)
做中教,做中学,实践中共同进步!
原文地址:/rocedu/p/6064234.html
推荐网站:博客园、新浪微博、扇贝背单词、DKY背单词小组、有道云笔记、豆瓣读书
版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”