Java专栏案例

wen java案例 1

本文目录导读:

Java专栏案例

  1. 基础语法案例
  2. 实战项目案例
  3. 学习建议

我为你整理了一个完整的Java学习专栏案例体系,从基础到高级,包含实战案例,以下是精选的Java核心案例:

基础语法案例

案例1:学生成绩管理系统(面向对象基础)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
// 学生类
class Student {
    private String id;
    private String name;
    private double score;
    public Student(String id, String name, double score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }
    // getter和setter方法
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getScore() { return score; }
    public void setScore(double score) { this.score = score; }
    @Override
    public String toString() {
        return "学生信息 [学号=" + id + ", 姓名=" + name + ", 成绩=" + score + "]";
    }
}
// 管理系统类
public class StudentManager {
    private List<Student> students = new ArrayList<>();
    // 添加学生
    public void addStudent(Student student) {
        students.add(student);
        System.out.println("添加成功!");
    }
    // 删除学生
    public void removeStudent(String id) {
        boolean found = false;
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getId().equals(id)) {
                students.remove(i);
                found = true;
                System.out.println("删除成功!");
                break;
            }
        }
        if (!found) {
            System.out.println("未找到该学生!");
        }
    }
    // 修改学生信息
    public void updateStudent(String id, String newName, double newScore) {
        for (Student s : students) {
            if (s.getId().equals(id)) {
                s.setName(newName);
                s.setScore(newScore);
                System.out.println("修改成功!");
                return;
            }
        }
        System.out.println("未找到该学生!");
    }
    // 查询所有学生
    public void displayAll() {
        if (students.isEmpty()) {
            System.out.println("暂无学生数据");
            return;
        }
        System.out.println("=== 所有学生信息 ===");
        for (Student s : students) {
            System.out.println(s);
        }
    }
    // 按成绩排序
    public void sortByScore() {
        students.sort((s1, s2) -> Double.compare(s2.getScore(), s1.getScore()));
        System.out.println("=== 按成绩排序 ===");
        displayAll();
    }
    // 主菜单
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
        Scanner scanner = new Scanner(System.in);
        while (true) {
            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.println("6. 退出");
            System.out.print("请选择操作:");
            int choice = scanner.nextInt();
            scanner.nextLine(); // 消耗换行
            switch (choice) {
                case 1:
                    System.out.print("请输入学号:");
                    String id = scanner.nextLine();
                    System.out.print("请输入姓名:");
                    String name = scanner.nextLine();
                    System.out.print("请输入成绩:");
                    double score = scanner.nextDouble();
                    manager.addStudent(new Student(id, name, score));
                    break;
                case 2:
                    System.out.print("请输入要删除的学号:");
                    String delId = scanner.nextLine();
                    manager.removeStudent(delId);
                    break;
                case 3:
                    System.out.print("请输入要修改的学号:");
                    String updId = scanner.nextLine();
                    System.out.print("请输入新姓名:");
                    String newName = scanner.nextLine();
                    System.out.print("请输入新成绩:");
                    double newScore = scanner.nextDouble();
                    manager.updateStudent(updId, newName, newScore);
                    break;
                case 4:
                    manager.displayAll();
                    break;
                case 5:
                    manager.sortByScore();
                    break;
                case 6:
                    System.out.println("感谢使用本系统,再见!");
                    scanner.close();
                    return;
                default:
                    System.out.println("无效选择,请重试!");
            }
        }
    }
}

案例2:银行账户系统(继承与多态)

// 抽象账户类
abstract class Account {
    protected String accountNo;
    protected double balance;
    public Account(String accountNo, double balance) {
        this.accountNo = accountNo;
        this.balance = balance;
    }
    // 抽象方法
    public abstract void deposit(double amount);       // 存款
    public abstract void withdraw(double amount);      // 取款
    public abstract void calculateInterest();          // 计算利息
    public double getBalance() {
        return balance;
    }
    public String getAccountNo() {
        return accountNo;
    }
}
// 储蓄账户
class SavingsAccount extends Account {
    private double interestRate = 0.03;  // 年利率3%
    public SavingsAccount(String accountNo, double balance) {
        super(accountNo, balance);
    }
    @Override
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("储蓄账户存款 " + amount + " 元成功");
        } else {
            System.out.println("存款金额必须大于0");
        }
    }
    @Override
    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            System.out.println("取款 " + amount + " 元成功");
        } else {
            System.out.println("取款失败,余额不足或金额无效");
        }
    }
    @Override
    public void calculateInterest() {
        double interest = balance * interestRate;
        System.out.println("储蓄账户利息:" + interest + " 元");
    }
}
// 信用卡账户
class CreditCardAccount extends Account {
    private double creditLimit;
    public CreditCardAccount(String accountNo, double balance, double creditLimit) {
        super(accountNo, balance);
        this.creditLimit = creditLimit;
    }
    @Override
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("信用卡存入 " + amount + " 元成功");
        }
    }
    @Override
    public void withdraw(double amount) {
        double available = balance + creditLimit;
        if (amount > 0 && amount <= available) {
            balance -= amount;
            System.out.println("信用卡消费 " + amount + " 元成功");
        } else {
            System.out.println("消费失败,超过信用额度");
        }
    }
    @Override
    public void calculateInterest() {
        if (balance < 0) {
            double interest = Math.abs(balance) * 0.05 * 30;  // 日利率0.05%
            System.out.println("信用卡需还利息:" + interest + " 元");
        } else {
            System.out.println("当前信用卡无透支,无需支付利息");
        }
    }
}
public class BankSystem {
    public static void main(String[] args) {
        // 使用多态
        Account savings = new SavingsAccount("SA001", 5000);
        Account creditCard = new CreditCardAccount("CC001", 3000, 5000);
        System.out.println("=== 银行账户系统演示 ===");
        // 储蓄账户操作
        System.out.println("\n【储蓄账户操作】");
        savings.deposit(1000);
        savings.withdraw(2000);
        savings.calculateInterest();
        System.out.println("当前余额:" + savings.getBalance());
        // 信用卡账户操作
        System.out.println("\n【信用卡账户操作】");
        creditCard.withdraw(3500);  // 透支消费
        creditCard.deposit(500);    // 还款
        creditCard.calculateInterest();
        System.out.println("当前余额:" + creditCard.getBalance());
    }
}

案例3:简易计算器(异常处理与GUI)

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleCalculator extends JFrame {
    private JTextField display;
    private double operand1 = 0;
    private String operator = "";
    private boolean isNewInput = true;
    public SimpleCalculator() {
        setTitle("简易计算器");
        setSize(300, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        // 显示区域
        display = new JTextField();
        display.setEditable(false);
        display.setFont(new Font("Arial", Font.BOLD, 24));
        display.setHorizontalAlignment(JTextField.RIGHT);
        add(display, BorderLayout.NORTH);
        // 按钮面板
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(4, 4, 5, 5));
        String[] buttons = {
            "7", "8", "9", "/",
            "4", "5", "6", "*",
            "1", "2", "3", "-",
            "0", ".", "=", "+"
        };
        for (String btnText : buttons) {
            JButton button = new JButton(btnText);
            button.addActionListener(new ButtonClickListener());
            buttonPanel.add(button);
        }
        add(buttonPanel, BorderLayout.CENTER);
    }
    private class ButtonClickListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String command = ((JButton) e.getSource()).getText();
            try {
                // 数字或小数点
                if (Character.isDigit(command.charAt(0)) || command.equals(".")) {
                    if (isNewInput) {
                        display.setText(command);
                        isNewInput = false;
                    } else {
                        display.setText(display.getText() + command);
                    }
                }
                // 运算符
                else if (command.equals("+") || command.equals("-") || 
                         command.equals("*") || command.equals("/")) {
                    if (!display.getText().isEmpty()) {
                        operand1 = Double.parseDouble(display.getText());
                        operator = command;
                        isNewInput = true;
                    }
                }
                // 等号
                else if (command.equals("=")) {
                    double operand2 = Double.parseDouble(display.getText());
                    double result = 0;
                    switch (operator) {
                        case "+": result = operand1 + operand2; break;
                        case "-": result = operand1 - operand2; break;
                        case "*": result = operand1 * operand2; break;
                        case "/": 
                            if (operand2 == 0) {
                                throw new ArithmeticException("除数不能为0");
                            }
                            result = operand1 / operand2; break;
                        default:
                            throw new IllegalStateException("无效的运算符");
                    }
                    display.setText(String.valueOf(result));
                    isNewInput = true;
                }
            } catch (ArithmeticException ex) {
                JOptionPane.showMessageDialog(SimpleCalculator.this, 
                    "计算错误:" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                display.setText("");
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(SimpleCalculator.this, 
                    "输入格式错误", "错误", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new SimpleCalculator().setVisible(true);
        });
    }
}

实战项目案例

案例4:多线程下载器(多线程与网络编程)

import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class MultiThreadDownloader {
    private static final int THREAD_COUNT = 5;
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("使用方法:java MultiThreadDownloader <URL> <保存路径>");
            return;
        }
        String urlStr = args[0];
        String savePath = args[1];
        try {
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("HEAD");
            conn.connect();
            // 获取文件大小
            long fileSize = conn.getContentLengthLong();
            System.out.println("文件大小:" + fileSize + " bytes");
            if (fileSize <= 0) {
                System.out.println("无法获取文件大小");
                return;
            }
            // 创建随机访问文件
            RandomAccessFile raf = new RandomAccessFile(savePath, "rw");
            raf.setLength(fileSize);
            raf.close();
            // 计算每部分大小
            long partSize = fileSize / THREAD_COUNT;
            // 创建线程池
            ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
            CountDownLatch latch = new CountDownLatch(THREAD_COUNT);
            // 启动下载线程
            for (int i = 0; i < THREAD_COUNT; i++) {
                long start = i * partSize;
                long end = (i == THREAD_COUNT - 1) ? fileSize - 1 : (i + 1) * partSize - 1;
                executor.execute(new DownloadTask(urlStr, savePath, start, end, latch));
            }
            // 等待所有线程完成
            latch.await();
            executor.shutdown();
            System.out.println("下载完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    static class DownloadTask implements Runnable {
        private String urlStr;
        private String savePath;
        private long start;
        private long end;
        private CountDownLatch latch;
        public DownloadTask(String urlStr, String savePath, long start, long end, CountDownLatch latch) {
            this.urlStr = urlStr;
            this.savePath = savePath;
            this.start = start;
            this.end = end;
            this.latch = latch;
        }
        @Override
        public void run() {
            try {
                URL url = new URL(urlStr);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                // 设置范围请求
                conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
                conn.connect();
                try (InputStream is = conn.getInputStream();
                     RandomAccessFile raf = new RandomAccessFile(savePath, "rw")) {
                    raf.seek(start);
                    byte[] buffer = new byte[1024 * 1024];
                    int bytesRead;
                    long totalRead = 0;
                    while ((bytesRead = is.read(buffer)) != -1) {
                        raf.write(buffer, 0, bytesRead);
                        totalRead += bytesRead;
                    }
                    System.out.printf("线程 %s 下载完成:%d - %d (共 %d bytes)%n", 
                        Thread.currentThread().getName(), start, start + totalRead, totalRead);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                latch.countDown();
            }
        }
    }
}

案例5:简单的Web服务器(Socket编程)

import java.io.*;
import java.net.*;
import java.nio.file.*;
import java.util.concurrent.*;
public class SimpleWebServer {
    private static final int PORT = 8080;
    private static final String WEB_ROOT = "./www";
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("Web服务器启动,端口:" + PORT);
            while (true) {
                Socket socket = serverSocket.accept();
                threadPool.execute(new ClientHandler(socket));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static class ClientHandler implements Runnable {
        private Socket socket;
        public ClientHandler(Socket socket) {
            this.socket = socket;
        }
        @Override
        public void run() {
            try {
                // 读取请求
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
                String requestLine = reader.readLine();
                if (requestLine == null) return;
                System.out.println("请求:" + requestLine);
                // 解析请求路径
                String[] parts = requestLine.split(" ");
                if (parts.length < 2) return;
                String filePath = parts[1];
                if (filePath.equals("/")) {
                    filePath = "/index.html";
                }
                // 读取文件
                Path path = Paths.get(WEB_ROOT + filePath);
                File file = path.toFile();
                OutputStream os = socket.getOutputStream();
                if (file.exists() && file.isFile()) {
                    // 发送响应头
                    String contentType = getContentType(file.getName());
                    String header = "HTTP/1.1 200 OK\r\n" +
                                   "Content-Type: " + contentType + "\r\n" +
                                   "Content-Length: " + file.length() + "\r\n" +
                                   "Connection: close\r\n\r\n";
                    os.write(header.getBytes());
                    // 发送文件内容
                    Files.copy(path, os);
                } else {
                    // 404响应
                    String error = "<html><body><h1>404 - 文件未找到</h1></body></html>";
                    String header = "HTTP/1.1 404 Not Found\r\n" +
                                   "Content-Type: text/html\r\n" +
                                   "Content-Length: " + error.length() + "\r\n" +
                                   "Connection: close\r\n\r\n";
                    os.write(header.getBytes());
                    os.write(error.getBytes());
                }
                os.flush();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        private String getContentType(String fileName) {
            if (fileName.endsWith(".html")) return "text/html";
            if (fileName.endsWith(".css")) return "text/css";
            if (fileName.endsWith(".js")) return "application/javascript";
            if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) return "image/jpeg";
            if (fileName.endsWith(".png")) return "image/png";
            return "application/octet-stream";
        }
    }
}

案例6:JDBC数据库操作

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
// 实体类
class User {
    private int id;
    private String username;
    private String email;
    public User(int id, String username, String email) {
        this.id = id;
        this.username = username;
        this.email = email;
    }
    // getters and setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", email=" + email + "]";
    }
}
public class JDBCDemo {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/testdb";
    private static final String USER = "root";
    private static final String PASSWORD = "password";
    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD)) {
            System.out.println("数据库连接成功!");
            // 创建表
            createTable(conn);
            // 插入数据
            insertUser(conn, "张三", "zhangsan@email.com");
            insertUser(conn, "李四", "lisi@email.com");
            insertUser(conn, "王五", "wangwu@email.com");
            // 查询数据
            List<User> users = queryUsers(conn);
            System.out.println("\n=== 用户列表 ===");
            users.forEach(System.out::println);
            // 更新数据
            updateUser(conn, 1, "张三改");
            // 删除数据
            deleteUser(conn, 3);
            // 最终查询
            users = queryUsers(conn);
            System.out.println("\n=== 修改后的用户列表 ===");
            users.forEach(System.out::println);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    private static void createTable(Connection conn) throws SQLException {
        String sql = "CREATE TABLE IF NOT EXISTS users (" +
                     "id INT AUTO_INCREMENT PRIMARY KEY, " +
                     "username VARCHAR(50) NOT NULL, " +
                     "email VARCHAR(100) NOT NULL)";
        try (Statement stmt = conn.createStatement()) {
            stmt.executeUpdate(sql);
            System.out.println("数据表创建或已存在");
        }
    }
    private static void insertUser(Connection conn, String username, String email) throws SQLException {
        String sql = "INSERT INTO users (username, email) VALUES (?, ?)";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, username);
            pstmt.setString(2, email);
            int affected = pstmt.executeUpdate();
            System.out.println("插入用户 " + username + " 成功,影响行数:" + affected);
        }
    }
    private static List<User> queryUsers(Connection conn) throws SQLException {
        List<User> users = new ArrayList<>();
        String sql = "SELECT * FROM users";
        try (Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                User user = new User(
                    rs.getInt("id"),
                    rs.getString("username"),
                    rs.getString("email")
                );
                users.add(user);
            }
        }
        return users;
    }
    private static void updateUser(Connection conn, int id, String newUsername) throws SQLException {
        String sql = "UPDATE users SET username = ? WHERE id = ?";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, newUsername);
            pstmt.setInt(2, id);
            int affected = pstmt.executeUpdate();
            System.out.println("更新用户ID " + id + " 成功,影响行数:" + affected);
        }
    }
    private static void deleteUser(Connection conn, int id) throws SQLException {
        String sql = "DELETE FROM users WHERE id = ?";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, id);
            int affected = pstmt.executeUpdate();
            System.out.println("删除用户ID " + id + " 成功,影响行数:" + affected);
        }
    }
}

学习建议

学习路线图

Java基础语法
    ↓
面向对象编程
    ↓
集合框架与泛型
    ↓
异常处理
    ↓
IO流与序列化
    ↓
多线程与并发
    ↓
网络编程
    ↓
JDBC数据库操作
    ↓
框架学习(Spring等)
    ↓
项目实战

每个案例的学习重点

案例 核心知识点 难度等级
学生管理系统 类、对象、集合、循环
银行系统 继承、多态、抽象类
计算器 异常处理、GUI、事件
多线程下载 线程池、并发编程
Web服务器 Socket、网络编程
JDBC操作 数据库操作、JDBC

实战项目推荐

  1. 简易聊天室

    技术要点:Socket、多线程、JSON

  2. 图书管理系统

    技术要点:JDBC、集合、MVC模式

  3. 在线投票系统

    技术要点:Servlet、JSP、数据库

  4. 文件加密工具

    技术要点:IO流、算法、GUI

  5. 股票数据可视化

    技术要点:网络API调用、Swing图表

常见问题解决

// 1. 内存泄漏问题
// 解决方案:使用try-with-resources
try (Connection conn = getConnection();
     PreparedStatement stmt = conn.prepareStatement(sql)) {
    // 业务逻辑
} catch (SQLException e) {
    e.printStackTrace();
}
// 2. 线程安全问题
// 解决方案:使用线程安全的集合
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
CopyOnWriteArrayList<Object> list = new CopyOnWriteArrayList<>();
// 3. 性能优化
// 使用StringBuilder而非字符串拼接
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i);
}

这些案例涵盖了Java的核心知识点,通过实战练习,可以快速掌握Java开发技能,建议按照难度等级循序渐进地学习,并为每个案例添加自己的创新想法,加深理解。

抱歉,评论功能暂时关闭!