zoukankan      html  css  js  c++  java
  • 《Java程序设计与数据结构教程(第二版)》学习指导

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

    目录

    图书简况

    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的可读性最好
    • 推荐图书

    • 代码规范

    程序开发

    • 冯氏结构与存储程序

      • 冯·诺依曼体系结构的要点包括:

        1. 计算机硬件应由运算器、存储器、控制器、输入设备、输出设备5大基本类型部件组成;
        2. 计算机内部采用二进制来表示指令和数据;
        3. 将编好的程序和数据先存入存储器中,然后再启动计算机工作,这就是存储程序的基本含义。
      • 计算机硬件的基础是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

    • 开发环境

    • 语法和语义

      • 语法规定程序的格式。不合语法的程序是无法编译的。
      • 语义规定程序语句的意义。
    • 错误

      • 三类错误
        • 编译时错误:语法错误,初学者易犯
        • 运行时错误:异常处理
        • 逻辑错误:要学会通过调试(debug)来定位错误(Java中使用JDB
          • 自顶向下进行调试
          • 学会设置断点(行断点/函数断点/条件断点/临时断点)
          • 学会单步运行
          • 循环的调试
          • 函数的调试
          • 二分法定位错误

    问题求解

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

    软件开发行为

    • 软件开发

      • 建立需求:做什么?
      • 生成设计:如何做?
      • 实现设计:设计到代码
      • 测试:做对没?
    • 三种代码

      • 伪代码
      • 产品代码
      • 测试代码
    • 三个公式

      • 程序 = 算法 + 数据结构
      • 软件 = 程序 + 软件工程
      • 软件企业 = 软件 + 商业模式
    • 推荐图书:

    面向对象程序设计

    • 概念:

      • 对象
      • 属性
      • 方法
    • 面向对象三要素:封装,继承,多态

    • 继承可以复用,更重要的是用继承实现多态;封装是继承的基础;继承是多态的基础。

    • 推荐图书

    自测题

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

    练习

    • 会在每周考试中体现

    程序设计项目

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

    动手实践

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

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

    相关链接

    拓展

    第二章 数据和表达式

    字符串

    变量和赋值

    • 变量:变量名和变量值 与内存的对应
    • 赋值
    • 常量: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
      • 本章代码不少数是固定的,如何修改一下上面的代码,让用户进行输入

    相关链接

    拓展

    返回目录

    第三章 使用类和对象

    创建对象

    • 基本数据类型与引用类型(类类型,自定义类型)
    • 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
    • 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

    相关链接

    拓展

    返回目录

    第四章 条件和循环

    布尔表达式

    • 控制流:顺序(存储程序)/分支(条件语句,特殊情况)/循环(自动化)
    • 分支和循环:依赖布尔表达式
    • 相等与关系运算
      • 主要用于整数(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
    • 方法设计

      • 方法的分解
      • 参数传递:
        • 传值
        • 传引用
    • 方法重载

      • 参数类型与数量
      • 不管返回值
    • 测试

      • 代码评审,走查
        • 结对
      • 缺陷测试: 质量保证
      • 单元测试: 模块测试
      • 集成测试:系统大组件的正确性
        • 回归测试
      • 系统测试:与需求的致性
        • 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};
      • 数组可以作为方法的参数
    • 对象数组

      • 对象数组的实例化,只是分配了保存引用的空间,每个元素中保存的对象还必须分别实例化
        • 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,如下图
        Throws
      • 注意多个catch一定把父类放后面处理
      • finally:总会执行,用于资源管理
    • 异常传播

      • 如果没有在异常发生处捕获及处理,异常会被传播给调用的方法
      • catch or throw?(如果要产生异常,程序员必须仔细考虑如何及在哪里处理异常)
        • throws:自己无法处理,用在方法声明
        • throw:方法中抛出Checked Exception,方法声明中必须有throws
    • 异常类的层次

      • Error及其子类写程序不用处理,最多留个日志
      • Java异常处理是要处理Exception类及其子类(Checked Exception)
      • Multi-catch:类之间不能有继承关系

      Exception

      • 学习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开发

    返回目录

    参考资料


    欢迎关注“rocedu”微信公众号(手机上长按二维码)

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

    rocedu



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


  • 相关阅读:
    ByteArrayInputStream&ByteArrayOutputStream源码分析
    常用FastJSON的SerializerFeature特性及日期转换格式
    SpringAware
    Zuul(SpringCloud学习笔记一)
    RabbitMQ和SpringBoot的简单整合列子
    Cngigure和BUS实现远端配置
    vagrant安装homestead环境使用总结
    sublime安装插件
    vagrant配置(假设已经安装好了vagrant并且下载好了box)
    linux php安装配置oci8模块
  • 原文地址:https://www.cnblogs.com/rocedu/p/6064234.html
Copyright © 2011-2022 走看看