Java 实战指南
java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, Java 实战指南!"); } }
点击绿色运行按钮,控制台输出对应文字,代表开发环境完美就绪。
## Java 基础核心概念速览
任何大型项目都由这些“积木块”构成。我们快速过一遍语法关键点,确保你能够看懂并写出基本逻辑。
### 变量与数据类型
Java 是强类型语言,使用变量前必须声明类型。
```java
int age = 25; // 整型
double price = 19.99; // 浮点型
char grade = 'A'; // 字符型
boolean isPassed = true; // 布尔型
String name = "张三"; // 字符串(引用类型)
运算符与控制流
运算符用于执行计算,控制流决定程序走向。
// 算术与比较
int sum = 10 + 5;
boolean result = (sum > 12) && (sum < 20);
// 条件分支
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 60) {
System.out.println("合格");
} else {
System.out.println("加油");
}
// 循环
for (int i = 0; i < 5; i++) {
System.out.println("循环次数: " + i);
}
方法(函数)
方法是组织代码的最小单元,提高复用性。
public static int add(int a, int b) {
return a + b;
}
面向对象编程实战
Java 的灵魂是面向对象。掌握类与对象、封装、继承和多态,你就能设计出结构清晰的应用。
类与对象
“类”是模板,“对象”是依据模板创建的实例。
// 定义一个学生类
public class Student {
// 属性(成员变量)
String name;
int age;
// 构造方法,用于创建对象时初始化
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 行为(方法)
public void study() {
System.out.println(name + " 正在学习...");
}
}
// 使用
Student stu = new Student("李四", 20);
stu.study();
封装与访问控制
通过 private 隐藏内部状态,提供公开的 getter 和 setter 方法保护数据。
public class BankAccount {
private double balance; // 外部不可直接访问
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
}
继承
子类继承父类的属性和方法,实现代码复用。
public class Animal {
public void eat() {
System.out.println("动物在吃");
}
}
public class Dog extends Animal {
public void bark() {
System.out.println("汪汪");
}
}
多态
父类引用指向子类对象,调用重写后的方法表现出不同行为。
Animal myPet = new Dog();
myPet.eat(); // 实际调用 Dog 可能重写的 eat 方法
抽象类与接口
抽象类定义“是什么”,接口定义“能做什么”。实战中常使用接口约束行为。
interface Flyable {
void fly();
}
class Bird extends Animal implements Flyable {
@Override
public void fly() {
System.out.println("鸟儿在飞");
}
}
核心 API 与集合框架
Java 提供了大量现成的工具类,掌握它们能极大提升开发效率。
字符串操作
String 是不可变对象,频繁拼接时使用 StringBuilder。
String s1 = "Hello";
String s2 = "World";
String result = s1 + " " + s2; // 每次拼接产生新对象
StringBuilder sb = new StringBuilder();
sb.append(s1).append(" ").append(s2);
System.out.println(sb.toString());
数组与集合
数组长度固定,适合存储已知数量的同类型元素。集合更灵活,是实战主力。
// 数组
int[] numbers = {1, 2, 3, 4, 5};
// ArrayList - 动态数组
List<String> names = new ArrayList<>();
names.add("王五");
names.add("赵六");
for (String name : names) {
System.out.println(name);
}
HashMap 键值对存储
通过键快速查找值,是使用频率极高的数据结构。
Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("数学", 95);
scoreMap.put("英语", 88);
int mathScore = scoreMap.get("数学");
迭代器与泛型
泛型让集合在编译期就确定类型,避免运行时转换异常。
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
异常处理与程序健壮性
程序运行时难免出错,优雅的异常处理能避免应用崩溃,提升用户体验。
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("数学运算错误: " + e.getMessage());
} finally {
System.out.println("这里的代码总会执行,通常用于释放资源");
}
自定义异常:当业务需要时,可以创建自己的异常类。
class AgeException extends Exception {
public AgeException(String msg) {
super(msg);
}
}
文件 I/O 与数据持久化
将数据保存到硬盘或从文件读取,是实际应用中不可或缺的能力。
// 写入文本文件
try (BufferedWriter writer = new BufferedWriter(new FileWriter("data.txt"))) {
writer.write("Java 实战文件写入");
} catch (IOException e) {
e.printStackTrace();
}
// 读取文本文件
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
如今多数项目使用更高级的 NIO 或第三方库,但传统 IO 的理解是基础。
多线程与并发基础
现代应用离不开多线程。Java 通过 Thread 类和 Runnable 接口开启并发执行。
class MyTask implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行中");
}
}
public class ThreadDemo {
public static void main(String[] args) {
Thread t1 = new Thread(new MyTask());
Thread t2 = new Thread(new MyTask());
t1.start();
t2.start();
}
}
安全建议:共享资源访问时务必使用 synchronized 或 Lock 等同步机制,避免数据错乱。初学者可先掌握 synchronized 块的基本用法。
JDBC 数据库连接实战
大部分后端应用需要操作数据库。JDBC 是 Java 连接数据库的标准接口。以 MySQL 为例:
- 添加 MySQL 驱动依赖(Maven:
mysql-connector-j)。 - 建立连接并执行 CRUD。
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()) {
// 插入
stmt.executeUpdate("INSERT INTO students(name,age) VALUES('小明',22)");
// 查询
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
while (rs.next()) {
System.out.println(rs.getString("name") + " " + rs.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}
实战项目:学生管理系统控制台版
现在我们将前面的知识整合,构建一个完整的控制台应用。功能包括:添加学生、查看所有学生、删除学生、退出系统。数据存储在内存的 ArrayList 中。
1. 学生实体类
public class Student {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// Getter & Setter 略
@Override
public String toString() {
return "ID:" + id + " 姓名:" + name + " 年龄:" + age;
}
}
2. 管理逻辑类
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class StudentManager {
private List<Student> students = new ArrayList<>();
private Scanner scanner = new Scanner(System.in);
public void start() {
while (true) {
System.out.println("===== 学生管理系统 =====");
System.out.println("1. 添加学生");
System.out.println("2. 查看所有学生");
System.out.println("3. 删除学生");
System.out.println("4. 退出");
System.out.print("请选择操作:");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行
switch (choice) {
case 1 -> addStudent();
case 2 -> listStudents();
case 3 -> deleteStudent();
case 4 -> {
System.out.println("感谢使用,再见!");
return;
}
default -> System.out.println("无效选项,请重新输入。");
}
}
}
private void addStudent() {
System.out.print("输入ID:");
int id = scanner.nextInt();
scanner.nextLine();
System.out.print("输入姓名:");
String name = scanner.nextLine();
System.out.print("输入年龄:");
int age = scanner.nextInt();
students.add(new Student(id, name, age));
System.out.println("添加成功!");
}
private void listStudents() {
if (students.isEmpty()) {
System.out.println("暂无学生信息。");
} else {
students.forEach(System.out::println);
}
}
private void deleteStudent() {
System.out.print("输入要删除的学生ID:");
int id = scanner.nextInt();
boolean removed = students.removeIf(s -> s.getId() == id);
System.out.println(removed ? "删除成功" : "未找到该ID的学生");
}
public static void main(String[] args) {
new StudentManager().start();
}
}