《Java程序设计与数据结构教程(第二版)》学习指导

《Java程序设计与数据结构教程(第二版)》学习指导

目录

  • 图书简况
  • 学习指导
  • 第一章 绪论
  • 第二章 数据和表达式
  • 第三章 使用类和对象
  • 第四章 条件和循环
  • 第五章 编写类
  • 第六章 图形用户界面
  • 第七章 数组
  • 第八章 继承
  • 第九章 多态
  • 第十章 异常
  • 第十一章 递归
  • 第十二章 算法分析
  • 第十三章 查找与排序
  • 第十四章 栈
  • 第十五章 队列
  • 第十六章 树
  • 第十七章 二叉排序树
  • 第十八章 堆和优先队列
  • 第十九章 图
  • 第二十章 哈希算法
  • 第二十一章 数据库
  • 补充:Java I/O
  • 补充:Java 多线程
  • 补充:Java网络编程
  • 补充:Java安全
  • 补充:Android开发

图书简况

Java程序设计与数据结构教程(第二版) (Java Foundations,官网)是我们《程序设计与数据结构》 课程的教材。本书颇具匠心地将程序设计、数据结构等相关课程内容有机地包含在一本书中,解决了这两门专业基础课不能很好地衔接的问题。本书将重点放在软件开发实践方面,使用数据结构的内容作为问题导引,在介绍经典算法的同时还介绍了如何用所学知识来解决实际问题。

《Java程序设计与数据结构教程(第二版)》学习指导_第1张图片

需要说明的是本书英文版已经出了第三版,希望大家能参考学习。

《Java程序设计与数据结构教程(第二版)》学习指导_第2张图片

这本书的内容来自作者John Lewis的另外两本书: Java程序设计教程(Java Software Solutions,官网)和Java软件结构与数据结构(Java Software Structures,官网)。这两本书在学习也是重要的学习参考。

《Java程序设计与数据结构教程(第二版)》学习指导_第3张图片

《Java程序设计与数据结构教程(第二版)》学习指导_第4张图片

考虑到大家没有上过《计算机导论》课程,推荐John Lewis参与编写的一本计算机科学概论(Computer Science Illuminated)作为学习参考,这本书用洋葱结构类比计算机结构,结构包含信息层、硬件层、程序设计层、操作系统层、应用程序层和通信层,基于洋葱结构深入剖析了计算系统的每个分层,然后讨论了计算的限制。书中还穿插了大量的人物传记、历史点评、道德问题和新的技术发展信息,有助于大家进一步了解计算机科学。

《Java程序设计与数据结构教程(第二版)》学习指导_第5张图片

返回目录

教材导读

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程序设计与数据结构教程(第二版)》学习指导_第6张图片

其他工具和教程参考「程序开发与信息安全工具箱」。

课程相关信息参考「《Java程序设计》 课程教学」。

相关链接

  • 图书范例下载:
    • Java程序设计与数据结构教程(第二版)源码
    • Java程序设计教程(第八版)源码
    • Java软件结构与数据结构

注意,这些代码都要求同学们自己一行一行的输入,运行,调试;提供下载链接主要是方便在遇到一些自己找不到的错误时对照用,千万不要把代码拷贝过去编译运行一下就完了,这样基本上什么也学不到!!!

参考代码驱动的程序设计学习中的「git的安装测试」部分,建立与教材配套的目录结构,目录要体现出自己学号姓名,如下图所示:

《Java程序设计与数据结构教程(第二版)》学习指导_第7张图片

  • Java 认证

返回目录

第一章 绪论

本章教学目标

  • 了解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(当前值)
  • 空白
    • 写代码不是写给机器的,是写给人(程序员,甚至你自己)的,要注意可读性
    • 写代码要想写书一样,分章/节/段/句
      《Java程序设计与数据结构教程(第二版)》学习指导_第8张图片
    • 对比一下程序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代码规范

程序开发

  • 冯氏结构与存储程序
    • 冯·诺依曼体系结构的要点包括:
      1. 计算机硬件应由运算器、存储器、控制器、输入设备、输出设备5大基本类型部件组成;
      2. 计算机内部采用二进制来表示指令和数据;
      3. 将编好的程序和数据先存入存储器中,然后再启动计算机工作,这就是存储程序的基本含义。
        《Java程序设计与数据结构教程(第二版)》学习指导_第9张图片
    • 计算机硬件的基础是CPU,它与内存和输入输出设备时行交互,从输入设备接收数据,向输出设备发送数据。CPU由运算器(算术逻辑单元ALU),控制器和一些寄存器组成。有一个非常重要的寄存器中叫程序计数器(Programming Counter,PC),在IA32中是EIP,指示将要执行的下一条指令在存储器中的地址。C/C++程序员可以认为EIP是一个指针,它总是指向内存的某一块区域,我们把这块区域称为代码段。CPU就是从EIP指向的那个地址取过来一条指令执行,执行完了之后IP会自加一,执行下一条指令,然后再取下一条指令执行,像贪吃蛇一样总是在内存里边吃指令。
    • CPU和内存和I/O设备通过总线相连接。内存中存放指令和数据。指令和数据的功能和处理上是不同的,但都可以用二进制的方式存储在内存中。
    • 冯·诺依曼体系结构的核心是「存储程序」。冯诺依曼体系结构就是存储程序计算机。

    《Java程序设计与数据结构教程(第二版)》学习指导_第10张图片

    • 上图说明了“自动化”的要义
  • 程序设计语言
    • 机器语言: 不同的CPU不同
    • 汇编语言:机器语言的助记符
    • 高级语言:可移植
    • 第四代语言
  • 编辑器/编译程序和解释程序
    • Linux 命令行中可以使用 od -tx1c src/01intro/Lincoln.java 查看源代码的存储情况
    • 理解图1.4, 理解Java 程序「一次编译,到处运行」主要是有了 字节码和JVM

《Java程序设计与数据结构教程(第二版)》学习指导_第11张图片

  • 开发环境
    • JDK下载地址在这, 相关文档中说明了JDK,JRE,JVM的区别:

    《Java程序设计与数据结构教程(第二版)》学习指导_第12张图片

    《Java程序设计与数据结构教程(第二版)》学习指导_第13张图片

    • IDE: Intellj IDEA, 参考Intellj IDEA 简易教程.
  • 语法和语义
    • 语法规定程序的格式。不合语法的程序是无法编译的。
    • 语义规定程序语句的意义。
  • 错误
    • 三类错误
      • 编译时错误:语法错误,初学者易犯
      • 运行时错误:异常处理
      • 逻辑错误:要学会通过调试(debug)来定位错误(Java中使用JDB)
        • 自顶向下进行调试
        • 学会设置断点(行断点/函数断点/条件断点/临时断点)
        • 学会单步运行
        • 循环的调试
        • 函数的调试
        • 二分法定位错误

问题求解

  • 软件开发的核心是问题求解,编写程序是为了解决问题。解决问题的能力是一切工作的根本。
  • 一般步骤
    • 理解问题
    • 设计方案
    • 考虑方案的选择并优化方案
    • 实现方案
    • 测试方案并修改存在的问题

软件开发行为

  • 软件开发
    • 建立需求:做什么?
    • 生成设计:如何做?
    • 实现设计:设计到代码
    • 测试:做对没?
  • 三种代码
    • 伪代码
    • 产品代码
    • 测试代码
  • 三个公式
    • 程序 = 算法 + 数据结构
    • 软件 = 程序 + 软件工程
    • 软件企业 = 软件 + 商业模式
  • 推荐图书:
    • 构建之法(电子版)
    • 代码大全(Code Complete)
    • 代码阅读

面向对象程序设计

  • 概念:
    • 对象
    • 属性
    • 方法
  • 面向对象三要素:封装,继承,多态
  • 继承可以复用,更重要的是用继承实现多态;封装是继承的基础;继承是多态的基础。

  • 推荐图书
    • UML精粹(UML Distilled)
    • 自测题

  • 练习一下,并对照答案查漏补缺
  • 每周测试会有题目出现
  • SR1.8:
    • OO基本元素:对象,类,封装,继承,多态;继承可以复用,更重要的是用继承实现多态;封装是继承的基础;继承是多态的基础。

练习

  • 会在每周考试中体现

程序设计项目

  • 至少完成 PP1.1, PP1.2

动手实践

  • p2 Linconln.java
    • 按前面的目录结构,我的工作目录如下(你要用自己的学号姓名信息建目录)
      741560-20170114122246181-630976045.png

    • 代码编辑我们推荐使用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..`; 如下图:

741560-20170114131332635-1366829361.png

相关链接

  • 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("\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写个转换器有加分
      • float
      • double
      • 另一个计算器
      • 表示过程
  • 字面量
    • 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: 重构
  • 调试
    • 使用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.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跟踪一下

相关链接

拓展

  • 面向对象设计的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
    • []的优先级最高
    • 第一次声明数组可以使用初值表代替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.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一起使用

      • 《Java程序设计与数据结构教程(第二版)》学习指导_第14张图片

    • abstract 与抽象类
      • 抽象类表达抽象概念,不能用new实例化
      • UML中的抽象类
      • 抽象类的子类
        • 实现父类的抽象方法变成具体类
        • 不实现父类抽象方法仍要用abstract修饰
  • 可见性
    • public protected 包 private 四种访问控制的区别
    • 《Java程序设计与数据结构教程(第二版)》学习指导_第15张图片
  • 设计继承
    • 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

拓展

  • 如何重写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.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,如下图
      《Java程序设计与数据结构教程(第二版)》学习指导_第16张图片
    • 注意多个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程序设计与数据结构教程(第二版)》学习指导_第17张图片

    • 学习Java API时一定对上层的类好好研究,学习,再学习和应用子类时就比较容易了

    • 自定义异常

  • I/O异常
    • 先学习I/O
      • 几乎所有的IO API都可能抛出异常
    • 流是字节序列
      • 字节流
      • 字符流
    • 标准流
      • System.in
      • System.out
      • System.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”微信公众号(手机上长按二维码)

做中教,做中学,实践中共同进步!


  • 原文地址:http://www.cnblogs.com/rocedu/p/6064234.html

  • 推荐网站:博客园、新浪微博、扇贝背单词、DKY背单词小组、有道云笔记、豆瓣读书

  • 版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0


如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文


转载于:https://www.cnblogs.com/rocedu/p/6064234.html

你可能感兴趣的:(《Java程序设计与数据结构教程(第二版)》学习指导)