Java程序设计案例教程
前言
本教程专为Java初学者和希望提升实战能力的开发者设计,我们坚信,编程学习最好的方式是“边学边做”,本教程将理论知识与精心设计的实战案例紧密结合,帮助你不仅“知其然”,更“知其所以然”。

适用人群
- 零基础的编程入门者
- 了解其他编程语言,想转战Java的开发者
- 需要项目经验来巩固Java基础知识的在校学生
- 希望通过案例快速上手Java的初级开发者
学习路径
我们将按照以下路径进行学习,从环境搭建到面向对象,再到核心API和项目实战,循序渐进。
- Java入门与环境搭建
- 基础语法:变量、数据类型与运算
- 流程控制:让你的程序“思考”起来
- 面向对象编程:Java的灵魂
- 核心API:Java的“工具箱”
- 异常处理:编写健壮的程序
- 文件I/O:与外部世界交互
- 多线程:让程序“一心多用”
- 网络编程入门:实现简单的通信
- 实战项目:综合运用
第一章:Java入门与环境搭建
理论要点
- Java是什么? 一门高级、面向对象、跨平台的编程语言。
- JDK, JRE, JVM的区别:
- JDK (Java Development Kit): Java开发工具包,包含JRE和开发工具(如编译器
javac)。 - JRE (Java Runtime Environment): Java运行时环境,包含JVM和核心类库。
- JVM (Java Virtual Machine): Java虚拟机,负责执行字节码文件,是实现“一次编写,到处运行”的关键。
- JDK (Java Development Kit): Java开发工具包,包含JRE和开发工具(如编译器
- 环境变量配置:配置
JAVA_HOME和Path,使得在任何目录下都能使用Java命令。
实战案例:你的第一个Java程序 - "Hello, World!"
目标:成功编写、编译并运行一个简单的Java程序。
步骤:
-
安装JDK:从Oracle官网或OpenJDK官网下载并安装适合你操作系统的JDK。
(图片来源网络,侵删) -
配置环境变量:
- 新建系统变量
JAVA_HOME,值为你的JDK安装路径(如C:\Program Files\Java\jdk-17)。 - 编辑系统变量
Path,添加%JAVA_HOME%\bin。
- 新建系统变量
-
编写代码:
- 创建一个新文件夹,如
D:\JavaProjects。 - 在该文件夹下,创建一个名为
HelloWorld.java的文件。 - 用记事本或VS Code等编辑器打开,输入以下代码:
// HelloWorld.java public class HelloWorld { public static void main(String[] args) { // 这是程序的主入口,程序从这里开始执行 System.out.println("Hello, World!"); } } - 创建一个新文件夹,如
-
编译代码:
- 打开命令行(CMD或PowerShell)。
- 进入项目目录:
cd D:\JavaProjects - 执行编译命令:
javac HelloWorld.java - 如果成功,会生成一个
HelloWorld.class文件,这是JVM可以识别的字节码文件。
-
运行程序:
(图片来源网络,侵删)- 在命令行中,执行运行命令:
java HelloWorld - 注意:这里不需要加
.class后缀。
- 在命令行中,执行运行命令:
预期输出:
Hello, World!
第二章:基础语法
理论要点
- 变量与数据类型:
- 基本类型:
int,double,char,boolean等,用于存储简单值。 - 引用类型:
String, 数组等,用于存储对象的引用。
- 基本类型:
- 运算符:算术运算符(, , , )、关系运算符(
>,<, )、逻辑运算符(&&, , )等。 - 类型转换:自动类型转换(隐式)和强制类型转换(显式)。
实战案例:简易计算器
目标:接收用户输入的两个数字和一个运算符,输出计算结果。
代码实现:
// SimpleCalculator.java
import java.util.Scanner; // 导入Scanner类,用于接收用户输入
public class SimpleCalculator {
public static void main(String[] args) {
// 1. 创建Scanner对象,读取控制台输入
Scanner scanner = new Scanner(System.in);
// 2. 提示用户输入第一个数字
System.out.print("请输入第一个数字: ");
double num1 = scanner.nextDouble();
// 3. 提示用户输入运算符
System.out.print("请输入运算符 (+, -, *, /): ");
char operator = scanner.next().charAt(0);
// 4. 提示用户输入第二个数字
System.out.print("请输入第二个数字: ");
double num2 = scanner.nextDouble();
double result = 0;
// 5. 使用switch语句根据运算符进行计算
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
// 处理除数为0的情况
if (num2 != 0) {
result = num1 / num2;
} else {
System.out.println("错误:除数不能为零!");
return; // 程序终止
}
break;
default:
System.out.println("错误:无效的运算符!");
return; // 程序终止
}
// 6. 输出结果
System.out.println("计算结果是: " + result);
// 7. 关闭Scanner,释放资源
scanner.close();
}
}
第三章:流程控制
理论要点
- 条件语句:
if-else,switch,用于根据条件执行不同的代码块。 - 循环语句:
for,while,do-while,用于重复执行某段代码。 - 跳转语句:
break,continue,用于控制循环流程。
实战案例:猜数字游戏
目标:程序随机生成一个1-100的整数,用户进行猜测,程序提示“猜大了”、“猜小了”或“猜对了”,并记录猜测次数。
代码实现:
// GuessNumberGame.java
import java.util.Random;
import java.util.Scanner;
public class GuessNumberGame {
public static void main(String[] args) {
Random random = new Random();
int targetNumber = random.nextInt(100) + 1; // 生成1-100的随机数
Scanner scanner = new Scanner(System.in);
int guessCount = 0;
System.out.println("欢迎来到猜数字游戏!");
System.out.println("我已经想好了一个1到100之间的整数。");
while (true) {
System.out.print("请输入你的猜测: ");
int userGuess = scanner.nextInt();
guessCount++;
if (userGuess == targetNumber) {
System.out.println("恭喜你!猜对了!");
System.out.println("你总共猜了 " + guessCount + " 次。");
break; // 猜对,退出循环
} else if (userGuess < targetNumber) {
System.out.println("猜小了,再大一点!");
} else {
System.out.println("猜大了,再小一点!");
}
}
scanner.close();
}
}
第四章:面向对象编程
理论要点
- 类与对象:类是模板,对象是实例。
Car是类,你的一辆红色的特斯拉就是Car的一个对象。 - 三大特性:
- 封装:将数据(属性)和操作数据的方法(行为)捆绑在一起,并对外部隐藏实现细节(通过
private和public)。 - 继承:子类继承父类的属性和方法,实现代码复用(
extends关键字)。 - 多态:同一操作作用于不同的对象,会产生不同的执行效果(通过方法重写和方法重载实现)。
- 封装:将数据(属性)和操作数据的方法(行为)捆绑在一起,并对外部隐藏实现细节(通过
- 关键字:
class,new,this,super,static,final等。
实战案例:设计一个“学生”类
目标:创建一个Student类,封装学生的基本信息和行为,并创建学生对象进行使用。
代码实现:
Student.java (类文件)
// Student.java
public class Student {
// 1. 属性 (用private修饰,实现封装)
private String name;
private int age;
private String studentId;
// 2. 构造方法 (用于创建对象时初始化属性)
public Student(String name, int age, String studentId) {
this.name = name;
this.age = age;
this.studentId = studentId;
System.out.println("学生 " + this.name + " 已创建。");
}
// 3. Getter 和 Setter 方法 (外部通过这些方法访问和修改私有属性)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0) { // 可以添加逻辑校验
this.age = age;
}
}
public String getStudentId() {
return studentId;
}
// 4. 行为方法
public void study() {
System.out.println(this.name + " 正在学习Java。");
}
public void showInfo() {
System.out.println("学生信息:");
System.out.println(" 姓名: " + this.name);
System.out.println(" 年龄: " + this.age);
System.out.println(" 学号: " + this.studentId);
}
}
SchoolDemo.java (主程序文件)
// SchoolDemo.java
public class SchoolDemo {
public static void main(String[] args) {
// 使用new关键字和构造方法创建Student对象
Student student1 = new Student("张三", 20, "S1001");
// 调用对象的方法
student1.showInfo();
student1.study();
// 使用Setter方法修改属性
System.out.println("\n一年后...");
student1.setAge(21);
student1.setName("张三丰");
student1.showInfo();
// 创建第二个对象
Student student2 = new Student("李四", 19, "S1002");
student2.showInfo();
}
}
第五章:核心API
理论要点
- 字符串处理:
String,StringBuilder,StringBuffer。 - 集合框架:
List,Set,Map接口及其常用实现类(ArrayList,HashSet,HashMap)。 - I/O流:字节流和字符流,用于读写文件。
- 多线程:
Thread类和Runnable接口。
实战案例:简易学生信息管理系统
目标:使用ArrayList来存储多个Student对象,并实现添加、删除、查询和显示所有学生信息的功能。
代码实现:
// StudentManager.java
import java.util.ArrayList;
import java.util.Scanner;
public class StudentManager {
private static ArrayList<Student> studentList = new ArrayList<>();
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
while (true) {
showMenu();
int choice = scanner.nextInt();
switch (choice) {
case 1:
addStudent();
break;
case 2:
deleteStudent();
break;
case 3:
findStudent();
break;
case 4:
showAllStudents();
break;
case 5:
System.out.println("感谢使用,再见!");
scanner.close();
System.exit(0);
default:
System.out.println("无效的输入,请重新选择!");
}
}
}
private static void showMenu() {
System.out.println("\n===== 学生信息管理系统 =====");
System.out.println("1. 添加学生");
System.out.println("2. 删除学生");
System.out.println("3. 查找学生");
System.out.println("4. 显示所有学生");
System.out.println("5. 退出");
System.out.print("请选择你的操作: ");
}
private static void addStudent() {
System.out.print("请输入姓名: ");
String name = scanner.next();
System.out.print("请输入年龄: ");
int age = scanner.nextInt();
System.out.print("请输入学号: ");
String id = scanner.next();
Student student = new Student(name, age, id);
studentList.add(student);
System.out.println("添加成功!");
}
private static void deleteStudent() {
System.out.print("请输入要删除的学生学号: ");
String id = scanner.next();
for (int i = 0; i < studentList.size(); i++) {
if (studentList.get(i).getStudentId().equals(id)) {
studentList.remove(i);
System.out.println("删除成功!");
return;
}
}
System.out.println("未找到该学号的学生!");
}
private static void findStudent() {
System.out.print("请输入要查找的学生学号: ");
String id = scanner.next();
for (Student student : studentList) {
if (student.getStudentId().equals(id)) {
student.showInfo();
return;
}
}
System.out.println("未找到该学号的学生!");
}
private static void showAllStudents() {
if (studentList.isEmpty()) {
System.out.println("当前没有学生信息!");
} else {
System.out.println("===== 所有学生信息 =====");
for (Student student : studentList) {
student.showInfo();
System.out.println("----------------------");
}
}
}
}
(注:此案例复用了上一章的Student类)
后续章节展望
- 异常处理:在上述案例中增加对非法输入(如输入年龄为文字)的处理,使用
try-catch块。 - 文件I/O:将学生信息保存到文件中,下次启动程序时可以从文件中加载,实现数据持久化。
- 多线程:将耗时的操作(如从网络下载大量数据)放在一个单独的线程中执行,避免主界面卡顿。
- 实战项目:
- 控制版图书店管理系统:管理书籍的进、销、存。
- 多人在线聊天室(简易版):使用Socket编程,实现客户端和服务端的通信。
- Swing/JavaFX GUI应用:为上述学生管理系统开发图形用户界面,使其更易用。
总结与建议
- 动手敲代码:不要只看不练,教程中的每一个案例都请务必自己动手敲一遍、运行一遍、修改一下看看效果。
- 多思考多提问:理解代码背后的逻辑,为什么用
ArrayList而不是数组?为什么Student的属性要设为private? - 查阅官方文档:学会使用Oracle官方的Java Documentation,这是最权威、最准确的学习资料。
- 坚持实践:从简单的案例开始,逐步构建更复杂的项目,这是成为优秀Java开发者的必经之路。
希望这份案例教程能对你有所帮助!祝你学习愉快!
