Java程序设计
更新: 1/6/2025 字数: 0 字 时长: 0 分钟
- 考试题型:四道大题
- 时间:10:40 - 12:40
- 地点:西楼 - 514
- 监考老师:赵雪、马媛
基础知识
开发到运行的三个步骤
- 编写代码:使用 IDE 或文本编辑器编写
.java
文件。 - 编译代码:用
javac
将.java
文件编译为.class
字节码文件。 - 运行程序:用
java
命令在 JVM 上运行.class
字节码文件。
Scanner 类的使用
// 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 分支语句
switch (表达式) {
case 值1:
// 执行代码块1
break;
case 值2:
// 执行代码块2
break;
// 可选,处理所有未匹配的情况
default:
// 执行默认代码块
}
- 表达式:必须是
byte
、short
、int
、char
或其包装类,以及enum
和String
case
值:必须是常量表达式,不能重复break
:跳出switch
块,避免继续执行后续的case
代码default
:可选,处理所有未匹配的情况- 如果省略
break
,程序会继续执行后续的case
代码,直到遇到break
或switch
结束。- JDK 7 之前
switch
不支持String
,因为switch
的实现基于整数类型的跳转表。而 JDK 7 对switch
的底层实现进行了扩展,允许String
类型,编译时会对String
进行哈希计算并转换为整数处理。
数组的三种创建方式
先声明后创建
javaClassName[] array; array = new ClassName[3];
声明的同时创建
javaClassName[] array = new ClassName[3];
声明的同时直接赋值
javaClassName[] array = {new ClassName(), new ClassName(), new ClassName()};
构造方法
public class 类名 {
// 构造方法
public 类名() {
// 初始化代码
}
public 类名(参数列表) {
// 带参数的构造方法
}
}
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 中用于组织类和接口的结构,类似于文件夹。它的主要作用包括:
- 防止类名冲突:包为类提供了命名空间,不同包中的同名类不会冲突。
- 组织代码:将相关类和接口归类,增强代码结构的清晰性。
- 访问控制:通过包控制类和成员的可见性,增强安全性。
- 代码复用:便于将代码打包成库供其他项目使用。
使用包时,通过 package
关键字声明类所属的包,并可用 import
语句引入其他包中的类。
图形界面
- 图形界面布局管理器
- FlowLayout 流式布局:按从左到右、从上到下的顺序排列组件。
- BorderLayout 边界布局:将容器分为东、南、西、北、中五个区域。
- GridLayout 网格布局:以表格形式排列组件,每个组件大小相同。
- CardLayout 卡片布局:将多个组件层叠在一起,一次只显示一个组件,适合实现多页面切换。
- GridBagLayout 网格包布局:功能强大的布局管理器,允许组件在网格中跨行跨列,组件大小可以不同,适用于复杂的布局需求。
异常处理
try-catch-finally 块
用于捕获和处理异常。try 块中放置可能抛出异常的代码,catch 块处理异常,finally 块用于释放资源,无论是否发生异常都会执行。
javatry { // 可能抛出异常的代码 } catch (ExceptionType e) { // 处理异常 } finally { // 始终执行的代码 }
throw 关键字
在方法体内显式抛出异常。用于在特定条件下手动抛出异常。
javapublic void someMethod() { throw new IllegalArgumentException("Invalid argument"); }
throws 关键字
在方法签名中声明可能抛出的异常,由调用者负责处理。适用于将异常传播到上层调用。
javapublic void someMethod() throws IOException { // 可能抛出异常的代码 }
自定义异常
创建自定义异常类,继承自 Exception 或 RuntimeException,并在代码中根据需要抛出自定义异常。
javaclass CustomException extends Exception { public CustomException(String message) { super(message); } } public void someMethod() throws CustomException { throw new CustomException("This is a custom exception"); }
线程的使用
在 Java 中,使用线程有两种主要方法:
- 继承
Thread
类:创建一个类继承Thread
,重写run()
方法,然后调用start()
方法启动线程。 - 实现
Runnable
接口:创建一个类实现Runnable
接口,重写run()
方法,使用Thread
类将其传入构造函数,调用start()
方法启动线程。
推荐使用实现 Runnable
接口的方法,因为它更灵活,可以避免多继承的限制。
练习题
编写代码
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)_______________
}
}
this.brand = brand;
// 将参数 brand 赋值给成员变量 brandthis.price = price;
// 将参数 price 赋值给成员变量 pricethis.amount = amount;
// 将参数 amount 赋值给成员变量 amountthis.energyType = energyType;
// 将参数 energyType 赋值给成员变量 energyType
使用
this
关键字指代当前对象的属性,可以区分参数和成员变量。通过构造函数将参数值赋值给类的成员变量。
对象数组
写出生成上面 10 个 Car 对象数组的语句。
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()
创建每个数组元素。
数据库操作
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();
}
}
}
}
jdbc:mysql://localhost:3306/school
// 填入正确的数据库 URLClass
// 加载 MySQL 驱动getConnection
// 调用 getConnection 方法ClassNotFoundException e
// 捕获 ClassNotFoundException 异常SQLException e
// 捕获 SQLException 异常SQLException e
// 捕获 SQLException 异常
根据题目给出的“数据库类型”和“数据库名”修改 JDBC URL
捕获 ClassNotFoundException 和 SQLException,处理加载驱动和数据库操作中的异常。
程序找错误
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);
}
}
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);
}
}
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.*;
以便使用JFrame
、JTextPane
等类修改
import javax.awt.*;
为import java.awt.*;
正确导入awt
包修改
implements JFrame
为extends JFrame
因为JFrame
不是接口,所以不能被实现修改
public void ReciteWords()
为public ReciteWords()
因为构造方法没有返回值修改
this.setVisible(false);
为this.setVisible(true);
使窗口可见修改
setLocationRelativeto
为setLocationRelativeTo
因为方法名错误可选修改
javaprivate 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元”。
定义接口
Payment
javapublic interface Payment { void pay(double amount); }
定义抽象类
AbstractPayment
javapublic abstract class AbstractPayment implements Payment { @Override public abstract void pay(double amount); }
实现具体支付方式
CreditCardPayment
类javapublic class CreditCardPayment extends AbstractPayment { @Override public void pay(double amount) { System.out.println("信用卡支付金额:" + amount + "元"); } }
AlipayPayment
类javapublic class AlipayPayment extends AbstractPayment { @Override public void pay(double amount) { System.out.println("支付宝支付金额:" + amount + "元"); } }
WeChatPayment
类javapublic class WeChatPayment extends AbstractPayment { @Override public void pay(double amount) { System.out.println("微信支付金额:" + amount + "元"); } }