第1章 Java语言概述
一、软件开发介绍
1.1 软件开发基础
- 软件分类:
- 系统软件(如操作系统)
- 应用软件(如微信、支付宝)
- 人机交互方式:
- GUI(图形界面):直观易用(如Windows)
- CLI(命令行):需记忆命令(如Linux终端)
1.2 常用DOS命令
命令 | 功能 | 示例 |
---|---|---|
dir | 列出当前目录内容 | dir |
md | 创建目录 | md test |
cd | 切换目录 | cd D:\code |
del | 删除文件 | del test.txt |
echo | 创建文件并写入内容 | echo hi > a.txt |
二、计算机编程语言
2.1 编程语言发展
代际 | 类型 | 特点 | 示例 |
---|---|---|---|
第一代 | 机器语言 | 二进制指令 | 01010101 |
第二代 | 汇编语言 | 使用助记符 | MOV AX, 5 |
第三代 | 高级语言 | 面向过程/对象,跨平台 | C、Java、Python |
2.2 Java语言优势
- 市场需求大:长期占据TIOBE排行榜前三
- 跨平台性:一次编写,到处运行(JVM实现)
- 生态完善:企业级应用、Android开发、大数据领域广泛应用
三、Java语言核心特性
3.1 Java简史
- 1991年:Green项目,Oak语言诞生
- 1995年:更名为Java,正式发布
- 2009年:Oracle收购Sun
- 2014年:JDK 8发布(Lambda表达式、Stream API)
3.2 技术体系
平台 | 应用场景 |
---|---|
Java SE | 桌面应用开发 |
Java EE | 企业级Web应用(如Spring) |
Java ME | 嵌入式设备开发 |
3.3 主要特性
- 面向对象:封装、继承、多态
- 健壮性:自动内存管理(GC)、强类型检查
- 跨平台性:JVM实现“一次编译,到处运行”
四、Java运行机制
4.1 核心机制
- JVM(Java虚拟机):执行字节码,屏蔽底层差异
- 垃圾回收(GC):自动管理内存,开发者无需手动释放
4.2 运行流程
五、环境搭建
5.1 JDK与JRE
组件 | 说明 | 包含内容 |
---|---|---|
JDK | Java开发工具包 | JRE + 开发工具(javac等) |
JRE | Java运行环境 | JVM + 核心类库 |
5.2 环境变量配置
- 新增系统变量
JAVA_HOME
:指向JDK安装路径(如D:\jdk1.8
) - 编辑
Path
:添加%JAVA_HOME%\bin
验证命令:
java -version # 查看Java版本
javac # 检查编译环境
六、HelloWorld
6.1 开发步骤
- 编写代码(
HelloWorld.java
):public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
- 编译:
javac HelloWorld.java
→ 生成HelloWorld.class
- 运行:
java HelloWorld
6.2 注意事项
- 类名与文件名必须一致(区分大小写)
main
方法是程序入口,格式固定
七、常见问题
错误现象 | 原因 | 解决方案 |
---|---|---|
'javac' 不是内部命令 | Path未配置或配置错误 | 检查环境变量 |
找不到主类 | 类名与文件名不一致 | 统一命名 |
需要 ';' | 语句缺少分号 | 检查代码语法 |
公共类应在同名文件中声明 | public类名与文件名不匹配 | 修改类名或文件名 |
八、注释规范
8.1 注释类型
类型 | 语法 | 用途 |
---|---|---|
单行注释 | // 注释内容 | 解释单行代码 |
多行注释 | /* 注释内容 */ | 解释代码块 |
文档注释 | /** 注释内容 */ | 生成API文档(javadoc) |
8.2 文档注释示例
/**
* 计算两数之和
* @param a 第一个加数
* @param b 第二个加数
* @return 两数之和
*/
public int add(int a, int b) {
return a + b;
}
九、API文档
9.1 使用场景
- 查询Java类库的功能和用法
- 官方下载地址:Oracle Java SE Documentation
9.2 核心内容
- 包结构:按功能分类(如
java.util
、java.io
) - 类与方法说明:包含参数、返回值、异常信息
十、编程风格
10.1 代码规范
- 缩进:使用Tab键(4个空格)
- 运算符空格:
int sum = a + b;
- 块风格:行尾风格(推荐)
public class Test { public static void main(String[] args) { // 代码 } }
十一、开发工具
11.1 主流IDE对比
工具 | 特点 | 适用场景 |
---|---|---|
Eclipse | 免费、插件丰富 | 企业级开发 |
IntelliJ IDEA | 智能提示强大、集成度高 | 全栈开发 |
VS Code | 轻量级、支持多语言 | 小型项目/脚本 |
作业练习
- 编写HelloWorld程序,添加必要注释
- 打印个人信息(每项占一行):
System.out.println("姓名:张三"); System.out.println("性别:男");
- 使用转义符打印如下图形:
System.out.println("*\t*\tI love Java\t*"); System.out.println("*\t*\t*\t*");
知识回顾
- Java通过JVM实现跨平台
- JDK包含开发工具,JRE包含运行环境
- 环境变量Path配置是全局命令调用的关键
- 注释是提高代码可读性的重要手段
第2章 Java基本语法(上):变量与运算符
1. 关键字与保留字
关键字(Keyword)
- 定义:被Java赋予特殊含义的字符串,所有字母小写。
- 分类:
- 数据类型:
class
,interface
,byte
,int
,boolean
,void
等。 - 流程控制:
if
,else
,for
,while
,break
,return
等。 - 访问权限:
private
,protected
,public
。 - 异常处理:
try
,catch
,finally
,throw
。 - 其他:
new
,this
,static
,package
,import
。
- 数据类型:
- 完整列表:Oracle官方文档
保留字(Reserved Word)
- 定义:目前未使用但未来可能作为关键字的标识符。
- 示例:
goto
,const
。
2. 标识符(Identifier)
定义规则
- 组成:字母、数字、
_
、$
,且数字不能开头。 - 区分大小写,长度无限制。
- 不能包含空格,不能是关键字或保留字(但可包含)。
命名规范
类型 | 规则 | 示例 |
---|---|---|
包名 | 全小写,多单词用. 分隔 | com.util |
类名/接口名 | 首字母大写(大驼峰) | StudentScore |
变量名/方法名 | 首字母小写(小驼峰) | studentName |
常量名 | 全大写,用_ 分隔 | MAX_VALUE |
注意:建议使用英文命名,避免使用汉字。
3. 变量
变量概念
- 内存中的存储区域,包含类型、名称和值。
- 作用域:定义所在的
{}
内,同一作用域不能重复定义。
变量分类
按数据类型
- 基本数据类型(8种):
- 整数:
byte
(1B),short
(2B),int
(4B),long
(8B) - 浮点:
float
(4B),double
(8B) - 字符:
char
(2B) - 布尔:
boolean
(1B)
- 整数:
- 引用数据类型:类、接口、数组、String。
按声明位置
- 成员变量:类体内声明(实例变量、类变量)。
- 局部变量:方法体内声明(需显式初始化)。
数据类型转换
自动类型转换
- 规则:小容量 → 大容量。
- 顺序:
byte
→short
→int
→long
→float
→double
。 - 示例:
int a = 10; double b = a; // 自动转换
强制类型转换
- 语法:
(目标类型) 值
,可能导致精度损失。 - 示例:
double x = 10.5; int y = (int) x; // y = 10
进制转换
进制 | 前缀 | 示例 |
---|---|---|
二进制 | 0b /0B | 0b1010 |
八进制 | 0 | 0123 |
十六进制 | 0x /0X | 0x1AF |
转换规则:
- 十进制 → 其他进制:除基取余法。
- 其他进制 → 十进制:按权展开求和。
4. 运算符
算术运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 加法/字符串连接 | 3 + 5 = 8 ,"a" + "b" = "ab" |
- | 减法 | 5 - 3 = 2 |
* | 乘法 | 2 * 3 = 6 |
/ | 除法(取整) | 5 / 2 = 2 |
% | 取模 | 5 % 2 = 1 |
++ /-- | 自增/自减 | a++ (先取值后运算) |
注意:byte
/short
运算时自动提升为int
。
赋值运算符
- 扩展赋值运算符:
+=
,-=
,*=
,/=
,%=
。 - 示例:
short s = 3; s += 2; // 合法,等价于 s = (short)(s + 2)
比较运算符
运算符 | 描述 | 示例 |
---|---|---|
== | 等于 | 3 == 5 → false |
!= | 不等于 | 3 != 5 → true |
instanceof | 类型检查 | "Hello" instanceof String → true |
逻辑运算符
运算符 | 描述 | 示例 |
---|---|---|
&& | 短路与 | true && false → false |
` | ` | |
! | 逻辑非 | !true → false |
^ | 异或 | true ^ true → false |
位运算符
运算符 | 描述 | 示例 |
---|---|---|
<< | 左移 | 3 << 2 → 12 |
>> | 带符号右移 | -8 >> 1 → -4 |
>>> | 无符号右移 | -8 >>> 1 → 2147483644 |
& | 按位与 | 6 & 3 → 2 |
` | ` | 按位或 |
三元运算符
- 语法:
条件 ? 表达式1 : 表达式2
- 示例:
int max = (a > b) ? a : b;
运算符优先级
优先级 | 运算符 |
---|---|
最高 | () , [] , . |
↓ | ! , ~ , ++ , -- |
↓ | * , / , % |
↓ | + , - |
↓ | << , >> , >>> |
↓ | && , ` |
最低 | = , += , -= 等赋值运算符 |
练习示例
// 打印数字的个位、十位、百位
int num = 153;
System.out.println("个位数:" + (num % 10));
System.out.println("十位数:" + (num / 10 % 10));
System.out.println("百位数:" + (num / 100));
输出:
个位数:3
十位数:5
百位数:1
第2章 Java基本语法(下):程序流程控制
1. 程序流程控制概述
- 流程控制:控制程序中各语句的执行顺序。
- 三种基本结构:
- 顺序结构:从上到下逐行执行。
- 分支结构:根据条件选择性执行代码(
if-else
、switch-case
)。 - 循环结构:根据条件重复执行代码(
for
、while
、do-while
)。
2. 顺序结构
- 特点:程序从上到下逐行执行,没有判断和跳转。
- 示例:
public class Test { int num1 = 12; int num2 = num1 + 2; // 合法前向引用 }
- 错误示例:
public class Test { int num2 = num1 + 2; // 错误,num1未定义 int num1 = 12; }
3. 分支结构
3.1 if-else结构
-
三种格式:
- 单分支:
if (条件表达式) { 执行代码块; }
- 双分支:
if (条件表达式) { 执行代码块1; } else { 执行代码块2; }
- 多分支:
if (条件表达式1) { 执行代码块1; } else if (条件表达式2) { 执行代码块2; } else { 执行代码块n; }
- 单分支:
-
注意事项:
- 条件表达式必须是布尔类型。
else
是可选的,且可以嵌套使用。- 多个条件为“互斥”关系时,顺序无关;为“包含”关系时,应从小到大判断。
-
示例:
int age = 75; if (age < 0) { System.out.println("不可能!"); } else if (age > 250) { System.out.println("是个妖怪!"); } else { System.out.println("人家芳龄 " + age + ",马马虎虎啦!"); }
3.2 switch-case结构
-
语法:
switch (表达式) { case 常量1: 语句1; break; case 常量2: 语句2; break; default: 语句; break; }
-
规则:
- 表达式类型:
byte
、short
、char
、int
、枚举(JDK 5.0)、String
(JDK 7.0)。 case
后的值必须是常量,且不能重复。break
用于跳出switch
,若无break
,会继续执行后续case
。default
是可选的,位置灵活。
- 表达式类型:
-
示例:
int i = 1; switch (i) { case 0: System.out.println("zero"); break; case 1: System.out.println("one"); break; default: System.out.println("default"); break; }
4. 循环结构
4.1 for循环
-
语法:
for (初始化部分; 循环条件部分; 迭代部分) { 循环体部分; }
-
执行过程:初始化 → 条件判断 → 循环体 → 迭代 → 条件判断 → …
-
示例:
for (int i = 1; i <= 100; i++) { System.out.println(i); }
4.2 while循环
-
语法:
初始化部分; while (循环条件部分) { 循环体部分; 迭代部分; }
-
示例:
int i = 1; while (i <= 100) { System.out.println(i); i++; }
4.3 do-while循环
-
语法:
初始化部分; do { 循环体部分; 迭代部分; } while (循环条件部分);
-
特点:至少执行一次循环体。
-
示例:
int i = 1; do { System.out.println(i); i++; } while (i <= 100);
5. 嵌套循环
- 定义:一个循环放在另一个循环体内。
- 特点:外层循环执行一次,内层循环执行多次。
- 示例:
for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(j + "*" + i + "=" + (i * j) + "\t"); } System.out.println(); }
6. 特殊关键字
6.1 break
- 作用:终止当前循环或
switch
语句。 - 示例:
for (int i = 0; i < 10; i++) { if (i == 3) break; System.out.println(i); }
6.2 continue
- 作用:跳过本次循环,继续下一次循环。
- 示例:
for (int i = 0; i < 10; i++) { if (i % 2 == 0) continue; System.out.println(i); }
6.3 return
- 作用:结束当前方法,返回结果。
- 示例:
public int add(int a, int b) { return a + b; }
综合练习
1. 家庭收支记账软件
- 功能:记录家庭的收入和支出,支持查看明细、登记收入、登记支出、退出程序。
- 示例:
public class FamilyAccount { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int balance = 10000; // 初始余额 while (true) { System.out.println("1. 收支明细"); System.out.println("2. 登记收入"); System.out.println("3. 登记支出"); System.out.println("4. 退出"); int choice = scanner.nextInt(); switch (choice) { case 1: System.out.println("当前余额:" + balance); break; case 2: System.out.println("请输入收入金额:"); int income = scanner.nextInt(); balance += income; break; case 3: System.out.println("请输入支出金额:"); int expense = scanner.nextInt(); balance -= expense; break; case 4: System.out.println("退出程序"); return; } } } }
第三章 数组
1. 数组的概述
- 定义: 数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号(索引)管理数据。
- 数组的基本概念
- 数组名
- 下标(索引)
- 元素
- 数组的长度
数组的特点
- 引用数据类型: 数组本身是引用数据类型,元素可以是基本数据类型或引用数据类型。
- 内存分配: 创建数组时会在内存中开辟一块连续的空间,数组名指向该空间的首地址。
- 长度不可变: 数组一旦创建,其长度不可修改。
- 访问速度快: 通过索引直接访问元素。
数组的分类
分类方式 | 类型 |
---|---|
按维度 | 一维数组、二维数组、多维数组 |
按数据类型 | 基本数据类型数组、引用数据类型数组(对象数组) |
2. 一维数组的使用
2.1 声明
// 两种声明方式
int a[];
int[] b;
String[] c; // 引用类型变量数组
⚠️ 注意: 声明数组时不能指定长度,例如 int a[5];
是非法的。
2.2 初始化
(1)动态初始化
int[] arr = new int[3]; // 长度为3
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
(2)静态初始化
int[] arr = {3, 9, 8}; // 直接初始化
String[] names = {"李四光", "茅以升", "华罗庚"};
2.3 数组的引用
- 数组元素的访问:
数组名[索引]
- 索引范围:
0 ~ n-1
- 数组长度:
数组名.length
int[] arr = new int[5];
System.out.println(arr.length); // 输出5
2.4 数组的默认初始化值
数据类型 | 默认值 |
---|---|
byte, short, int, long | 0 |
float, double | 0.0 |
char | ‘\u0000’ (空字符) |
boolean | false |
引用类型 | null |
int[] a = new int[5];
System.out.println(a[3]); // 默认值0
2.5 内存解析
- 栈(Stack): 局部变量存储
- 堆(Heap): 数组存储
- 方法区(Method Area): 常量池、类信息存储
示例:
int[] arr = new int[]{1,2,3};
String[] arr1 = new String[4];
arr1[1] = "刘德华";
3. 多维数组
3.1 二维数组的声明
int[][] arr; // 声明二维数组
int arr[][]; // 另一种方式
3.2 初始化
(1)动态初始化
int[][] arr = new int[3][2]; // 3行2列
arr[0][1] = 78;
(2)静态初始化
int[][] arr = {{3, 8, 2}, {2, 7}, {9, 0, 1, 6}};
⚠️ 注意: int[][] arr = new int[][3];
是非法的。
3.3 二维数组的内存解析
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[4];
- 堆区存储:
arr
存储的是多个一维数组的引用,而非一个连续的二维矩阵。
4. 数组中的常见算法
4.1 赋值
示例:杨辉三角
int[][] yanghui = new int[10][];
for(int i = 0; i < yanghui.length; i++) {
yanghui[i] = new int[i + 1];
yanghui[i][0] = yanghui[i][i] = 1;
for(int j = 1; j < i; j++) {
yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];
}
}
4.2 查找
- 线性查找
for(int i = 0; i < arr.length; i++) {
if(arr[i] == target) {
System.out.println("找到索引: " + i);
break;
}
}
- 二分查找(前提:数组必须有序)
int[] arr = {-99, -54, -2, 0, 2, 33, 256, 999};
int target = 256;
int left = 0, right = arr.length - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(arr[mid] == target) {
System.out.println("找到索引: " + mid);
break;
} else if(arr[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
4.3 排序
- 冒泡排序
for(int i = 0; i < arr.length - 1; i++) {
for(int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
- 快速排序
public static void quickSort(int[] arr, int left, int right) {
if(left < right) {
int pivot = partition(arr, left, right);
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[left];
while(left < right) {
while(left < right && arr[right] >= pivot) right--;
arr[left] = arr[right];
while(left < right && arr[left] <= pivot) left++;
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
5. Arrays 工具类
- 排序:
Arrays.sort(arr)
- 查找:
Arrays.binarySearch(arr, key)
- 填充:
Arrays.fill(arr, val)
- 比较:
Arrays.equals(arr1, arr2)
- 转字符串:
Arrays.toString(arr)
示例:
int[] numbers = {5, 900, 1, 5, 77, 30, 64, 700};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
6. 数组常见异常
异常类型 | 触发情况 |
---|---|
ArrayIndexOutOfBoundsException | 访问超出索引范围 |
NullPointerException | 数组未初始化就访问元素 |
示例:
int[] arr = null;
System.out.println(arr[0]); // 报错