第1章Java开发入门
1.1Java概述
1.1.1认识Java
1.1.2Java发展史
1.1.3Java语言的特点
1.2JDK的使用
1.2.1下载JDK
1.2.2安装JDK
1.2.3配置JDK
1.2.4测试开发环境
1.2.5JDK目录介绍
1.3第一个Java程序
1.3.1编写Java源文件
1.3.2编译运行
1.3.3Java虚拟机(JVM)
1.4Java运行流程
1.5本章小结
1.6习题
第2章Java编程基础
2.1Java的基本语法
2.1.1语句和表达式
2.1.2基本格式
2.1.3注释
2.1.4关键字
2.1.5进制转换
2.2基本数据类型
2.2.1整数类型
2.2.2浮点数类型
2.2.3字符类型
2.2.4布尔类型
2.3变量与常量
2.3.1标识符
2.3.2变量的定义
2.3.3变量的类型转换
2.3.4变量的作用域
2.3.5常量
2.4Java中的运算符
2.4.1算术运算符
2.4.2赋值运算符
2.4.3关系运算符
2.4.4逻辑运算符
2.4.5位运算符
2.4.6运算符的优先级
2.5程序的结构
2.5.1顺序结构
2.5.2选择结构
2.5.3循环结构
2.5.4循环中断
2.6本章小结
2.7习题
第3章数组与方法
3.1数组
3.1.1数组的定义
3.1.2数组的初始化
3.1.3数组的常用操作
3.1.4数组的内存原理
3.1.5二维数组
3.2方法
3.2.1方法的定义
3.2.2方法的调用
3.2.3方法的重载
3.2.4方法的递归
3.3数组的引用传递
3.4本章小结
3.5习题
第4章面向对象(上)
4.1面向对象的概念
4.2类与对象
4.2.1类的定义
4.2.2对象的创建与使用
4.2.3类的封装
4.3构造方法
4.3.1构造方法的定义
4.3.2构造方法的重载
4.4this关键字
4.5垃圾回收
4.6static关键字
4.6.1静态变量
4.6.2静态方法
4.6.3代码块
4.6.4单例模式
4.7内部类
4.7.1成员内部类
4.7.2静态内部类
4.7.3方法内部类
4.7.4匿名内部类
4.8本章小结
4.9习题
第5章面向对象(下)
5.1类的继承
5.1.1继承的概念
5.1.2重写父类方法
5.1.3super关键字
5.2final关键字
5.2.1final关键字修饰类
5.2.2final关键字修饰方法
5.2.3final关键字修饰变量
5.3抽象类和接口
5.3.1抽象类
5.3.2接口
5.3.3接口的实现
5.3.4接口的继承
5.3.5抽象类和接口的关系
5.4多态
5.4.1多态的概念
5.4.2对象的类型转换
5.4.3Object类
5.4.4设计模式——工厂设计模式
5.4.5设计模式——代理设计模式
5.5包
5.5.1包的定义与使用
5.5.2import语句
5.5.3Java的常用包
5.5.4给Java应用程序打包
5.6访问控制
5.7本章小结
5.8习题
第6章异常
6.1异常的概念
6.2异常捕获
6.3在方法中抛出异常
6.3.1使用throws关键字抛出异常
6.3.2使用throw关键字抛出异常
6.4Exception和Runtime Exception
6.5自定义异常
6.6断言
6.7异常的使用原则
6.8本章小结
6.9习题
第7章多线程
7.1线程概述
7.1.1进程
7.1.2线程
7.2线程的创建
7.2.1继承Thread类创建线程
7.2.2实现Runnable接口创建线程
7.2.3使用Callable接口和Future接口创建线程
7.2.4三种实现多线程方式的对比分析
7.3线程的生命周期及状态转换
7.4线程的调度
7.4.1线程的优先级
7.4.2线程休眠
7.4.3线程让步
7.4.4线程插队
7.4.5后台线程
7.5多线程同步
7.5.1线程安全
7.5.2同步代码块
7.5.3同步方法
7.5.4死锁问题
7.6多线程通信
7.7线程组和未处理的异常
7.8线程池
7.9本章小结
7.10习题
第8章Java基础类库
8.1基本类型的包装类
8.2JDK 5.0新特性——自动装箱和拆箱
8.3Scanner类
8.4String类、StringBuffer类和StringBuilder类
8.4.1String类的初始化
8.4.2String类的常见操作
8.4.3StringBuffer类
8.4.4StringBuilder类
8.4.5String类对正则表达式的支持
8.5System类与Runtime类
8.5.1System类
8.5.2Runtime类
8.6Math类与Random类
8.6.1Math类
8.6.2Random类
8.7日期操作类
8.7.1Date类
8.7.2Calendar类
8.7.3DateFormat类
8.7.4SimpleDateFormat类
8.8JDK 7.0新特性——switch语句支持字符串类型
8.9本章小结
8.10习题
第9章集合类
9.1集合概述
9.2Collection接口
9.3List接口
9.3.1List接口简介
9.3.2ArrayList集合
9.3.3LinkedList实现类
9.3.4Iterator接口
9.3.5JDK5.0新特性——foreach循环
9.3.6ListIterator接口
9.3.7Enumeration接口
9.4Set接口
9.4.1Set接口简介
9.4.2HashSet集合
9.4.3TreeSet集合
9.5Queue接口
9.5.1Queue接口简介
9.5.2PriorityQueue实现类
9.5.3Deque接口与ArrayDeque实现类
9.6Map接口
9.6.1Map接口简介
9.6.2HashMap集合
9.6.3LinkedHashMap集合
9.6.4TreeMap集合
9.6.5Properties集合
9.7JDK 5.0新特性——泛型
9.7.1为什么使用泛型
9.7.2泛型定义
9.7.3通配符
9.7.4有界类型
9.7.5泛型的限制
9.7.6自定义泛型
9.8Collections工具类
9.9Arrays工具类
9.10集合转换
9.11本章小结
9.12习题
第10章IO(输入输出)
10.1流概述
10.2字节流
10.2.1字节流的概念
10.2.2字节流读写文件
10.2.3文件的复制
10.2.4字节流的缓冲区
10.2.5装饰设计模式
10.2.6字节缓冲流
10.3字符流
10.3.1字符流定义及基本用法
10.3.2字符流操作文件
10.3.3字符流的缓冲区
10.3.4LineNumberReader
10.3.5转换流
10.4其他IO流
10.4.1ObjectInputStream和ObjectOutputStream
10.4.2DataInputStream和DataOutputStream
10.4.3PrintStream
10.4.4标准输入输出流
10.4.5PipedInputStream和PipedOutputStream
10.4.6ByteArrayInputStream和ByteArrayOutputStream
10.4.7CharArrayReader和CharArrayWriter
10.4.8SequenceInputStream
10.5File类
10.5.1File类的常用方法
10.5.2遍历目录下的文件
10.5.3文件过滤
10.5.4删除文件及目录
10.6RandomAccessFile
10.7字符编码
10.7.1常用字符集
10.7.2字符编码和解码
10.7.3字符传输
10.8本章小结
10.9习题
第11章GUI(图形用户界面)
11.1AWT概述
11.2AWT事件处理
11.2.1事件处理机制
11.2.2事件适配器
11.2.3用匿名内部类实现事件处理
11.3常用事件分类
11.3.1窗体事件
11.3.2鼠标事件
11.3.3键盘事件
11.3.4动作事件
11.4布局管理器
11.4.1FlowLayout
11.4.2BorderLayout
11.4.3GridLayout
11.4.4GridBagLayout
11.4.5CardLayout
11.4.6不使用布局管理器
11.5AWT绘图
11.6Swing
11.6.1JFrame
11.6.2JDialog
11.6.3中间容器
11.6.4文本组件
11.6.5按钮组件
11.6.6JComboBox
11.6.7菜单组件
11.6.8创建Tree
11.6.9JTable
11.7本章小结
11.8习题
第12章网络编程
12.1网络通信协议
12.1.1IP地址和端口号
12.1.2InetAddress
12.1.3UDP与TCP协议
12.2UDP通信
12.2.1DatagramPacket
12.2.2DatagramSocket
12.2.3UDP网络程序
12.2.4UDP案例——聊天程序
12.3TCP通信
12.3.1ServerSocket
12.3.2Socket
12.3.3简单的TCP网络程序
12.3.4多线程的TCP网络程序
12.3.5TCP案例——文件上传
12.4Java Applet
12.5本章小结
12.6习题
第13章Eclipse开发工具
13.1Eclipse概念
13.2Eclipse安装与启动
13.2.1Eclipse工作台
13.2.2Eclipse透视图
13.3使用Eclipse进行程序开发
13.3.1创建Java项目
13.3.2创建类文件
13.3.3编写代码
13.3.4运行程序
13.4Eclipse程序调试
13.5使用Eclipse导出、导入jar文件
13.5.1Eclipse导出jar文件
13.5.2Eclipse导入jar文件
13.6本章小结
13.7习题
第3章
chapter3
数组与方法
本章学习目标
了解Java数组的定义
掌握Java数组的常用操作
理解Java二维数组
掌握Java的方法定义与调用
掌握Java方法重载与递归
理解Java数组的引用传递
在开发过程中需要定义多个相同类型的变量时,使用数组是一个很好的选择。例如,要存储80名学生的成绩,在没有数组之前,就需要定义80个变量,很明显这个定义的过程相当琐碎,耗费时间和精力,于是Java语言提供了数组来存储相同类型的数据,这样要存储80名学生的成绩,只需一个数组就可以了。当遇到有些代码需要反复使用的情况时,可以将代码声明成一个方法,以供程序反复调用。
3.1数组
数组是一种数据结构,是按一定顺序排列的相同类型的元素集合。数组实际上就是一连串类型相同的变量,这些变量用一个名字命名,即数组名,并用索引区分它们。使用数组时,可以通过索引来访问数组元素,如数组元素的赋值和取值。
3.1.1数组的定义
在Java中数组是相同类型元素的集合,可以存放上千万个数据,在一个数组中,数组元素的类型是唯一的,即一个数组中只能存储同一种数据类型的数据,而不能存储多种数据类型的数据,数组一旦定义好就不可以修改长度,因为数组在内存中所占的大小是固定的,所以数组的长度不能改变,如果要修改就必须重新定义一个新数组或者引用其他的数组,因此数组的灵活性较差。
数组是可以保存一组数据的一种数据结构,它本身也会占用一个内存地址,因此数组是引用类型。定义数组的语法格式如下:
数据类型[]数组名;
对于数组的声明也可用另外一种形式,其语法格式如下:
数据类型数组名[];
上述两种不同语法格式声明的数组中,“[]”是一维数组的标识,从语法格式可见,它既可放置在数组名前面,也可以放在数组名后面。面向对象程序设计更侧重放在前面,保留放在后面是为了迎合C程序员的使用习惯,在这里推荐使用第一种格式。下面演示不同数据类型的数组声明,具体示例如下:
int[]a;//声明一个int类型的数组
doubleb[];//声明一个double类型的数组
上述示例中声明了一个int类型的数组a与一个double类型的数组b,数组名是用来统一这组相同数据类型的元素名称,数组名的命名规则和变量相同。
3.1.2数组的初始化
在Java程序开发中,使用数组之前都会对其进行初始化,这是因为数组是引用类型,声明数组只是声明了一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使用该数组变量来访问数组元素。所谓数组初始化,就是让数组名指向数组对象的过程,该过程主要分为两个步骤:一是对数组对象进行初始化,即为数组中的元素分配内存空间和赋值;二是对数组名进行初始化,即将数组名赋值为数组对象的引用。
通过两种方式可对数组进行初始化,即静态初始化和动态初始化,下面演示这两种方式的具体语法。
1.静态初始化
静态初始化是指由程序员在初始化数组时为数组每个元素赋值,由系统决定数组的长度。
数组的静态初始化有两种方式,具体示例如下:
int[]array;//声明一个int类型的数组
array=newint[]{1,2,3,4,5};//静态初始化数组
int[]array=newint[]{1,2,3,4,5};//声明并初始化数组
对于数组的静态初始化也可简写,具体示例如下:
int[]array={1,2,3,4,5};//声明并初始化一个int类型的数组
上述示例中静态初始化了数组,其中大括号包含数组元素值,元素值之间用逗号“,”分隔。此处注意,只有在定义数组的同时执行数组初始化才支持使用简化的静态初始化。
2.动态初始化
动态初始化是指由程序员在初始化数组时指定数组的长度,由系统为数组元素分配初始值。
数组动态初始化的具体示例如下:
int[]array=newint[10];//动态初始化数组
上述示例会在数组声明的同时分配一块内存空间供该数组使用,其中数组长度是10,由于每个元素都为int型数据类型,因此上例中数组占用的内存共有10×4=40个字节。此外,动态初始化数组时,其元素会根据它的数据类型被设置为默认的初始值。本例数组中每个元素的默认值为0,其他常见的数据类型默认值如表3.1所示。
表3.1数据类型默认值表
成员变量类型初始值成员变量类型初始值
byte0double0.0D
short0char空字符,'\u0000'
int0booleanfalse
long0L引用数据类型null
float0.0F
3.1.3数组的常用操作
1.访问数组
在Java中,数组对象有一个length属性,用于表示数组的长度,所有类型的数组都是如此。
获取数组长度的语法格式如下:
数组名.length
接下来用length属性获取数组的长度,具体示例如下:
int[]list=newint[10];//定义一个int类型的数组
intsize=list.length;//size=10,数组的长度
数组中的变量又称为元素,考虑到一个数组中的元素可能会很多,为了便于区分它们,每个元素都有下标(索引),下标从0开始,如在int[]list=newint[10]中,list[0]是第1个元素,list[1]是第2个元素,……,list[9]是第10个元素,也就是最后一个元素。因此,假如数组list有n个元素,那么list[0]是第一个元素,而list[n1]则是最后一个元素。
如果下标值小于0,或者大于等于数组长度,编译程序不会报任何错误,但运行时将出现异常:ArrayIndexOutOfBoundsException:N,即数组下标越界异常,N表示试图访问的数组下标。
2.数组遍历
数组的遍历是指依次访问数组中的每个元素。接下来演示循环遍历数组,如例31所示。
例31TestArrayTraversal.java
1publicclassTestArrayTraversal{
2publicstaticvoidmain(String[]args){
3int[]list={1,2,3,4,5};//定义数组
4for(inti=0;i
5System.out.println(list[i]);//索引访问数组
6}
7}
8}
程序的运行结果如图3.1所示。
图3.1例31运行结果
在例31中,声明并静态初始化了一个int类型的数组,然后利用for循环中的循环变量充当数组的索引,依次递增索引,从而遍历数组元素。
3.数组最大值和最小值
通过前面已经掌握的知识,用数组的基本用法与流程控制语句的使用来得到数组中的最大值和最小值。首先把数组的第一个数赋值给变量max和min,分别表示最大值和最小值,再依次判断数组的其他数值的大小,判断当前值是否最大值或最小值,如果不是则进行替换,最后输出最大值和最小值。接下来演示获取数组的最大值和最小值,如例32所示。
例32TestMostValue.java
1publicclassTestMostValue{
2publicstaticvoidmain(String[]args){
3//定义数组
4int[]score={88,62,12,100,28};
5intmax=0;//最大值
6intmin=0;//最小值
7max=min=score[0];//把第一个元素值赋给max和min
8for(inti=1;i
9if(score[i]>max){//依次判断后面元素值是否比max大
10max=score[i];//如果大,则修改max的值
11}
12if(score[i]
13min=score[i];//如果小,则修改min的值
14}
15}
16System.out.println("最大值:"+max);
17System.out.println("最小值:"+min);
18}
19}
……