Skip to content

Java程序设计

更新: 1/6/2025 字数: 0 字 时长: 0 分钟

  • 考试题型:四道大题
  • 时间:10:40 - 12:40
  • 地点:西楼 - 514
  • 监考老师:赵雪、马媛

基础知识

开发到运行的三个步骤

  1. 编写代码:使用 IDE 或文本编辑器编写 .java 文件。
  2. 编译代码:用 javac.java 文件编译为 .class 字节码文件。
  3. 运行程序:用 java 命令在 JVM 上运行 .class 字节码文件。

Scanner 类的使用

java
// Scanner 类位于 java.util 包中,使用前需要导入。
import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        // 创建 Scanner 对象,System.in 表示从标准输入(键盘)读取数据
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入一个整数
        System.out.print("请输入一个整数:");

        // 使用 nextInt() 方法,从用户输入中读取一个整数
        int number = scanner.nextInt();

        // 输出结果
        System.out.println("您输入的整数是:" + number);

        // 关闭 Scanner
        scanner.close();
    }
}

switch 分支语句

java
switch (表达式) {
    case 值1:
        // 执行代码块1
        break;
    case 值2:
        // 执行代码块2
        break;
    // 可选,处理所有未匹配的情况
    default:
        // 执行默认代码块
}
  • 表达式:必须是 byteshortintchar 或其包装类,以及 enumString
  • case 值:必须是常量表达式,不能重复
  • break:跳出 switch 块,避免继续执行后续的 case 代码
  • default:可选,处理所有未匹配的情况
  • 如果省略 break,程序会继续执行后续的 case 代码,直到遇到 breakswitch 结束。
  • JDK 7 之前 switch 不支持 String,因为 switch 的实现基于整数类型的跳转表。而 JDK 7 对 switch 的底层实现进行了扩展,允许 String 类型,编译时会对 String 进行哈希计算并转换为整数处理。

数组的三种创建方式

  1. 先声明后创建

    java
    ClassName[] array;
    array = new ClassName[3];
  2. 声明的同时创建

    java
    ClassName[] array = new ClassName[3];
  3. 声明的同时直接赋值

    java
    ClassName[] array = {new ClassName(), new ClassName(), new ClassName()};

构造方法

java
public class 类名 {
    // 构造方法
    public 类名() {
        // 初始化代码
    }
    public 类名(参数列表) {
        // 带参数的构造方法
    }
}
java
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name; // 将参数赋值给当前对象的属性
        this.age = age;
    }
}
  • 构造方法名称必须与类名相同。
  • 没有返回值,不能使用 return 语句。
  • 创建对象时自动调用。
  • 如果没有显式定义构造方法,Java 会提供一个默认无参构造方法。
  • 可以定义多个构造方法,但方法参数列表不同。

静态修饰符

  • 静态变量

    • 静态变量属于类,而不是某个对象。所有对象共享同一个静态变量的值。
    • 静态变量在类加载时初始化,生命周期贯穿程序整个运行周期。
    • 可以通过类名直接访问,也可以通过对象访问(不推荐)。
  • 静态方法

    • 静态方法属于类,而不是对象,可以通过类名直接调用。
    • 静态方法不能访问非静态变量或调用非静态方法,因为它们不依赖于具体对象。
    • 适用于不需要依赖对象状态的方法,例如工具类方法。
  • 静态代码块

    • 用于类的初始化。在类加载时执行,只执行一次。
    • 可以出现在类的任何地方,执行顺序按照定义的顺序执行。

包的概念

包(package) 是 Java 中用于组织类和接口的结构,类似于文件夹。它的主要作用包括:

  1. 防止类名冲突:包为类提供了命名空间,不同包中的同名类不会冲突。
  2. 组织代码:将相关类和接口归类,增强代码结构的清晰性。
  3. 访问控制:通过包控制类和成员的可见性,增强安全性。
  4. 代码复用:便于将代码打包成库供其他项目使用。

使用包时,通过 package 关键字声明类所属的包,并可用 import 语句引入其他包中的类。

图形界面

  • 图形界面布局管理器
    • FlowLayout 流式布局:按从左到右、从上到下的顺序排列组件。
    • BorderLayout 边界布局:将容器分为东、南、西、北、中五个区域。
    • GridLayout 网格布局:以表格形式排列组件,每个组件大小相同。
    • CardLayout 卡片布局:将多个组件层叠在一起,一次只显示一个组件,适合实现多页面切换。
    • GridBagLayout 网格包布局:功能强大的布局管理器,允许组件在网格中跨行跨列,组件大小可以不同,适用于复杂的布局需求。

异常处理

  • try-catch-finally 块

    用于捕获和处理异常。try 块中放置可能抛出异常的代码,catch 块处理异常,finally 块用于释放资源,无论是否发生异常都会执行。

    java
    try {
        // 可能抛出异常的代码
    } catch (ExceptionType e) {
        // 处理异常
    } finally {
        // 始终执行的代码
    }
  • throw 关键字

    在方法体内显式抛出异常。用于在特定条件下手动抛出异常。

    java
    public void someMethod() {
        throw new IllegalArgumentException("Invalid argument");
    }
  • throws 关键字

    在方法签名中声明可能抛出的异常,由调用者负责处理。适用于将异常传播到上层调用。

    java
    public void someMethod() throws IOException {
        // 可能抛出异常的代码
    }
  • 自定义异常

    创建自定义异常类,继承自 Exception 或 RuntimeException,并在代码中根据需要抛出自定义异常。

    java
    class CustomException extends Exception {
        public CustomException(String message) {
            super(message);
        }
    }
    
    public void someMethod() throws CustomException {
        throw new CustomException("This is a custom exception");
    }

线程的使用

在 Java 中,使用线程有两种主要方法:

  1. 继承 Thread:创建一个类继承 Thread,重写 run() 方法,然后调用 start() 方法启动线程。
  2. 实现 Runnable 接口:创建一个类实现 Runnable 接口,重写 run() 方法,使用 Thread 类将其传入构造函数,调用 start() 方法启动线程。

推荐使用实现 Runnable 接口的方法,因为它更灵活,可以避免多继承的限制。

练习题

编写代码

java
public class Car {

    private String brand;
    private double price;
    private int amount;
    private String energyType;

    public Car(String brand, double price, int amount, String energyType) {
        // 写出为属性赋值的代码
        // 1)_______________
        // 2)_______________
        // 3)_______________
        // 4)_______________
    }
}
  1. this.brand = brand; // 将参数 brand 赋值给成员变量 brand

  2. this.price = price; // 将参数 price 赋值给成员变量 price

  3. this.amount = amount; // 将参数 amount 赋值给成员变量 amount

  4. this.energyType = energyType; // 将参数 energyType 赋值给成员变量 energyType

使用 this 关键字指代当前对象的属性,可以区分参数和成员变量。

通过构造函数将参数值赋值给类的成员变量。

对象数组

写出生成上面 10 个 Car 对象数组的语句。

java
Car[] cars = new Car[10];
cars[0] = new Car("Brand1", 10000.0, 1, "Electric");
cars[1] = new Car("Brand2", 15000.0, 2, "Gasoline");
// ... 初始化其余 8 个对象

创建一个 Car 类型的数组,长度为 10。

使用 new Car() 创建每个数组元素。

数据库操作

java
import java.sql.*;

class ClassroomManager {

    private Connection cn = null;
    private PreparedStatement ps = null;
    private final String DB_URL = /* 1)______________ */;
    private final String USER = "root";
    private final String PASS = "1234";

    public void Classroom(String name, int capacity, String status) {

        try {
            // 加载数据库驱动
            /* 2)______________ */.forName("com.mysql.cj.jdbc.Driver");

            // 连接数据库
            cn = DriverManager./* 3)______________ */(DB_URL, USER, PASS);

            // 创建SQL语句
            String sql = "INSERT INTO classroom (name, capacity, status) VALUES (?, ?, ?)";
            ps = cn.prepareStatement(sql); // 准备SQL语句

            // 设置参数
            ps.setString(1, name);
            ps.setInt(2, capacity);
            ps.setString(3, status);

            int i = ps.executeUpdate(); // 执行SQL语句

            if (i > 0) {
                JOptionPane.showMessageDialog(null, "教室资源录入成功!", "教室管理系统", JOptionPane.INFORMATION_MESSAGE); // 显示消息框
            }

        } catch (/* 4)______________ */) {
            e.printStackTrace();
        } catch (/* 5)______________ */) {
            e.printStackTrace();
        } finally {
            // 关闭连接
            try {
                if (ps != null) ps.close();
                if (cn != null) cn.close();
            } catch (/* 6)______________ */) {
                e.printStackTrace();
            }
        }
    }
}
  1. jdbc:mysql://localhost:3306/school // 填入正确的数据库 URL

  2. Class // 加载 MySQL 驱动

  3. getConnection // 调用 getConnection 方法

  4. ClassNotFoundException e // 捕获 ClassNotFoundException 异常

  5. SQLException e // 捕获 SQLException 异常

  6. SQLException e // 捕获 SQLException 异常

根据题目给出的“数据库类型”和“数据库名”修改 JDBC URL

捕获 ClassNotFoundException 和 SQLException,处理加载驱动和数据库操作中的异常。

程序找错误

java
import javax.awt.*;

public class ReciteWords implements JFrame {

    private JTextPane jlb = new JTextPane();
    private JComboBox jcb1 = new JComboBox(new Object[]{"顺序", "随机"});
    private JComboBox jcb2 = new JComboBox(new Object[]{"1秒", "2秒", "3秒", "4秒", "5秒", "6秒", "7秒", "8秒", "9秒", "10秒"});

    public void ReciteWords() {
        this.setSize(600, 200);
        this.setVisible(false);
        this.setResizable(false); // 窗体大小不可变
        this.setLocationRelativeto(null); // 窗口居中
        this.setTitle("背单词");

        jlb.setEditable(false); // 设置显示区域的文本框为不能编辑状态

        JPanel p = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
        p.add(new JLabel("播放模式"));
        p.add(jcb1);
        p.add(new JLabel("播放速度"));
        p.add(jcb2);

        this.add(p, BorderLayout.NORTH);
        this.add(jlb, BorderLayout.CENTER);
    }
}
java
import javax.swing.*; 
import javax.awt.*; 
import java.awt.*; 

public class ReciteWords implements JFrame { 
public class ReciteWords extends JFrame { 

    private JTextPane jlb = new JTextPane();

    private JComboBox jcb1 = new JComboBox(new Object[]{"顺序", "随机"}); 
    private JComboBox<String> jcb1 = new JComboBox<>(new String[]{"顺序", "随机"}); 
    private JComboBox jcb2 = new JComboBox(new Object[]{"1秒", "2秒", "3秒", "4秒", "5秒", "6秒", "7秒", "8秒", "9秒", "10秒"}); 
    private JComboBox<String> jcb2 = new JComboBox<>(new String[]{"1秒", "2秒", "3秒", "4秒", "5秒", "6秒", "7秒", "8秒", "9秒", "10秒"}); 

    public void ReciteWords(){ 
    public ReciteWords() { 
        this.setSize(600, 200);
        this.setVisible(false); 
        this.setVisible(true); 
        this.setResizable(false); // 窗体大小不可变
        this.setLocationRelativeto(null); 
        this.setLocationRelativeTo(null); 
        this.setTitle("背单词");

        jlb.setEditable(false); // 设置显示区域的文本框为不能编辑状态

        JPanel p = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
        p.add(new JLabel("播放模式"));
        p.add(jcb1);
        p.add(new JLabel("播放速度"));
        p.add(jcb2);

        this.add(p, BorderLayout.NORTH);
        this.add(jlb, BorderLayout.CENTER);
    }
}
java
import javax.swing.*;
import java.awt.*;

public class ReciteWords extends JFrame {

    private JTextPane jlb = new JTextPane();
    private JComboBox<String> jcb1 = new JComboBox<>(new String[]{"顺序", "随机"});
    private JComboBox<String> jcb2 = new JComboBox<>(new String[]{"1秒", "2秒", "3秒", "4秒", "5秒", "6秒", "7秒", "8秒", "9秒", "10秒"});

    public ReciteWords() {
        this.setSize(600, 200);
        this.setVisible(true);
        this.setResizable(false); // 窗体大小不可变
        this.setLocationRelativeTo(null); // 窗口居中
        this.setTitle("背单词");

        jlb.setEditable(false); // 设置显示区域的文本框为不能编辑状态

        JPanel p = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
        p.add(new JLabel("播放模式"));
        p.add(jcb1);
        p.add(new JLabel("播放速度"));
        p.add(jcb2);

        this.add(p, BorderLayout.NORTH);
        this.add(jlb, BorderLayout.CENTER);
    }
}
  • 添加 import javax.swing.*; 以便使用 JFrameJTextPane 等类

  • 修改 import javax.awt.*;import java.awt.*; 正确导入 awt

  • 修改 implements JFrameextends JFrame 因为 JFrame 不是接口,所以不能被实现

  • 修改 public void ReciteWords()public ReciteWords() 因为构造方法没有返回值

  • 修改 this.setVisible(false);this.setVisible(true); 使窗口可见

  • 修改 setLocationRelativetosetLocationRelativeTo 因为方法名错误

  • 可选修改

    java
    private JComboBox jcb1 = new JComboBox(/* 省略 */); 
    private JComboBox<String> jcb1 = new JComboBox<>(/* 省略 */); 
    private JComboBox jcb2 = new JComboBox(/* 省略 */); 
    private JComboBox<String> jcb2 = new JComboBox<>(/* 省略 */); 

接口抽象类

1.定义接口:创建一个名为 Payment 的接口,包含一个方法 pay(double amount),用于执行支付操作。

2.定义抽象类:创建一个名为 AbstractPayment 的抽象类,实现 Payment 接口。

3.实现具体支付方式:创建三个类 CreditCardPayment、AlipayPayment 和 WeChatPayment,分别实现 AbstractPayment 抽象类,并实现 pay 方法。三个类的 pay 方法中输出显示“XXX支付金额:XXX元”。

  1. 定义接口 Payment

    java
    public interface Payment {
        void pay(double amount);
    }
  2. 定义抽象类 AbstractPayment

    java
    public abstract class AbstractPayment implements Payment {
        @Override
        public abstract void pay(double amount);
    }
  3. 实现具体支付方式

    • CreditCardPayment

      java
      public class CreditCardPayment extends AbstractPayment {
          @Override
          public void pay(double amount) {
              System.out.println("信用卡支付金额:" + amount + "元");
          }
      }
    • AlipayPayment

      java
      public class AlipayPayment extends AbstractPayment {
          @Override
          public void pay(double amount) {
              System.out.println("支付宝支付金额:" + amount + "元");
          }
      }
    • WeChatPayment

      java
      public class WeChatPayment extends AbstractPayment {
          @Override
          public void pay(double amount) {
              System.out.println("微信支付金额:" + amount + "元");
          }
      }

贡献者

The avatar of contributor named as wkwbk wkwbk

页面历史