Java练习题【大题】

练习1:

连接数据库分为哪几步

1、加载JDBC驱动

2、创建数据库连接

3、执行SQL语句

4、获得结果

5、关闭连接

练习2:

Java生命周期包括哪几种状态?并对它们做简要说明

1、新建状态(new):用户在创建线程时处于的状态

2、就绪状态(Runnable):当用户调用start()方法之后,线程处于就绪状态

3、运行状态(Running):当线程得到系统资源后进入运行状态

4、阻塞状态(Blocked):线程因为某种原因(wait()/sleep()等方法)放弃CPU使用权

5、死亡状态:(Dead):当线程run()方法执行完毕 或者因为异常退出了run()方法,线程进入死亡状态。

练习3:

Java异常类型有哪两种?它们有什么区别?捕获到的异常该如何处理?

1、Error、Exception

2、Error通常是灾难性的致命错误,是程序无法控制和处理的,当这些异常出现时,Java虚拟机一般会选择终止线程;Exception通常是可以被程序处理的,并且在程序中应尽可能的处理这些异常。

3、在当前方法中直接用try----catch处理;在当前方法中不处理,throws异常抛给调用者处理。

代码设计练习

练习1:

请阅读 EventHandler 类的代码,使用 if…else if…多分支结构,重新定义该类。要求:重新定义的代码中,类名称、方法名称、属性名称、可见性和代码功能等与原 EventHandler 类代码保持一致,并且包含必要的代码注释。

public class EventHandler{
public final static int CLICK=0;//点击
public final static int MOUSEMOVE=1;//鼠标移动
public final static int ENTER=2;//输入
public static void handle(int eventType) {
switch (eventType) {
case CLICK:{
//处理点击事件
break;
}
case MOUSEMOVE:{
//处理鼠标移动事件
break;
}
case ENTER:{
//处理输入事件
break;
}
default:{
System.out.println("不支持该类型的事件");
            }
        } 
    } 
}

答:

public class EventHandler {
public final static int CLICK=0;//点击
public final static int MOUSEMOVE=1;//鼠标移动
public final static int ENTER=2;//输入
public static void handle(int eventType) {
if(eventType == CLICK) {
//处理点击事件
}else if(eventType == MOUSEMOVE) {
//处理鼠标移动事件
}else if(eventType == ENTER){
//处理输入事件
}else {
System.out.println("不支持该类型的事件");
} } }

练习 2:

类 BookDAO 实现了初始化目标图书表的功能。请根据代码逻辑,把空白注释行填充完整(提示:作答时先标注序号,再说明对应代码行的作用)。

public class BookDAO implements BaseDAO{
private static Connection dbConnection=null;//定义数据库连接对象,初始化为
null
/**
* 使用静态代码块初始化 book 表
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");//_______________________
dbConnection=DriverManager.getConnection
("jdbc:mysql://localhost:3306/bookDB?user=root&password=bookpass");//_____
___
Statement sqlStatement = 
dbConnection.createStatement();//____________
sqlStatement.execute("drop table if exists 
booktable");//__________________
sqlStatement.execute("create table booktable (id int,book_name 
varchar(20) not null, primary key(id))");//_______________________________
sqlStatement.execute("insert into booktable values(1,'Java 
Programming')");
sqlStatement.execute("insert into booktable values(2,'C 
Programming')");//____
sqlStatement.close();//_________________________________________
} catch (ClassNotFoundException e) {
e.printStackTrace();//找不到数据库驱动类异常
} catch (SQLException e) {
e.printStackTrace();//SQL 语句异常
} }
@Override
public void insert(Book b){
//插入图书
}
@Override
public void delete(int bookID){
//删除图书
}
//该类的其他代码段省略......
}

答:

public class BookDAO implements BaseDAO{
private static Connection dbConnection=null;//定义数据库连接对象,初始化为 null
/**
* 使用静态代码块初始化 booktable 表
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");//加载 mysql 数据库驱动
dbConnection=DriverManager.getConnection
("jdbc:mysql://localhost:3306/bookDB?user=root&password=bookpass");//连接目标数据库
bookDB
Statement sqlStatement = dbConnection.createStatement();// 创建语句对象
sqlStatement.execute("drop table if exists booktable");// 执行 SQL 指令,如果
booktable 表已存在,则删除掉
sqlStatement.execute("create table booktable (id int,book_name varchar(20) not null, 
primary key(id))");// 执行 create table 指令,创建表 booktable,其表结构含有 id、book_name
字段,id 为主键,book_name 不允许为空
sqlStatement.execute("insert into booktable values(1,'Java Programming')");
sqlStatement.execute("insert into booktable values(2,'C Programming')");// 执行
insert 指令,向 booktable 数据表中写入 1 行数据
sqlStatement.close();//关闭 sqlStatement 语句对象,以释放与该对象关联的数据
库和 JDBC 资源
} catch (ClassNotFoundException e) {
e.printStackTrace();//找不到数据库驱动类异常
} catch (SQLException e) {
e.printStackTrace();//SQL 语句异常
} }
@Override
public void insert(Book b){
//插入图书
}
@Override
public void delete(int bookID){
//删除图书
}
//该类的其他代码段省略......
}

练习 3:

假设文件 src.txt 里面存储的是 ASCII 码的字符,请阅读 TestFile 类的代
码,完成以下问题的回答。
(1)请说明程序执行后 dst.txt 文件的内容和 src.txt 文件的内容的关系。
(2)while(…)里面的条件 content != -1 的作用是判断文件是否结束,能否将它替
换为其它的写法,并说明理由。
(3)如果文件 src.txt 里面存储的不一定是 ASCII 编码的字符,那么程序是否还
有意义?

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFile {
public static void main(String[] args) {
File testFile = new File("src.txt");
File testCopy = new File("dst.txt");
FileInputStream fis = null;
FileOutputStream fos = null;
int content;
try {
fis = new FileInputStream(testFile);
fos = new FileOutputStream(testCopy);
content = fis.read();
while (content != -1) {
if (Character.isUpperCase(content)) {
content = Character.toLowerCase(content);
}
fos.write(content);
content = fis.read();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
} }
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
} } } } }

答:

(1)dst.txt 文件里面的内容是 src.txt 文件里面内容的拷贝,只是拷贝时 dst.txt 还会将 src.txt
里面的大写字母转换为小写字母
(2)可以写为 content < 0,因为 fis.read()返回的值最小是-1,表示文件结束,否则都是大于
或等于 0 的非负数。
(3)没有意义。

练习 4:

请阅读下面的程序并回答问题
(1)在两处下划线处添加代码,启动 taskRun1 和 taskRun2 线程。
(2)说明调用 taskRun1.join()方法的意义
(3)说明语句 System.out.println(count);打印结果是确定的吗,为什么?

public class TestThread {
public static void main(String[] args) {
Task t = new Task();
t.runThread();
} }
class Task {
int count = 0;
Object obj = new Object();
public void runThread() {
Thread taskRun1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <= 1000; i++) {
synchronized (obj) {
count++; } } }
});
Thread taskRun2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <= 1000; i++) {
synchronized (obj) {
count++;
} } }
});
_____________//启动 taskRun1 线程
_____________//启动 taskRun2 线程
try {
taskRun1.join();
taskRun2.join();
System.out.println(count);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

答:

(1)taskRun1.start();
taskRun2.start();
(2)main 方法所在的主线程等待 taskRun1 线程完成才继续往下执行
(3)确定的 2000,因为对 count 的操作即 count++做了同步了

练习 5:

阅读下面的程序,回答问题
(1)给出程序的运行结果。

(2)能否将 main 方法中的”new Male();”替换为”new Female();”,如果可以,运行结果是什么?

(3)将 main 方法里面的开始和结束段的代码封装到 Judge 类的方法中。

public void doAll(…){
 …}

这个方法接收一个实现 Sport 接口的对象,方法实现里面依次调用 Sport 对象的 swim、ride 和 run 方法。这样 main 方法中的开始和结束段中的代码就可以注释掉,并打开对 doAll 方法的调用的注释,来实现连续的调用 Sport 对象的 3 个方法。

请按如上描述,实现 Judge 类的 doAll 方法。

interface Sport {
void run();
void swim();
void ride();
}
class Judge {
public Judge() {
// TODO Auto-generated constructor stub
}
public void run(Sport spt) {
spt.run();
}
public void swim(Sport spt) {
spt.swim();
}
public void ride(Sport spt) {
spt.ride();
}
// 实现 doAll 方法
// public void doAll(...) {
// ...
// } }
class Male implements Sport {
public Male() {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("a male is running");
}
@Override
public void swim() {
// TODO Auto-generated method stub
System.out.println("a male is swimming");
}
@Override
public void ride() {
// TODO Auto-generated method stub
 System.out.println("a male is riding");
} }
class Female implements Sport {
public Female() {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("a female is running");
}
@Override
public void swim() {
// TODO Auto-generated method stub
System.out.println("a female is swimming");
}
@Override
public void ride() {
// TODO Auto-generated method stub
System.out.println("a female is riding");
} }
public class TestInterface {
public static void main(String[] args) {
Judge judge= new Judge();
Sport spt = new Male();
// 开始(需要定义到方法里面的代码)
judge.swim(spt);
judge.ride(spt);
judge.run(spt);
// 结束(需要定义到方法里面的代码)
// judge.doAll(spt); // doAll 方法实现后就可以打开这个注释了
} }

答:

(1)a male is swimming
a male is riding
a male is running
(2)可以
a female is swimming
a female is riding
a female is running

(3)实现:

public void doAll(Sport spt) {
// 调用对象 spt 的 swim()、ride()、run()方法
spt.swim();
spt.ride();
spt.run();
}

练习 6:

请综合运用 Java 语言编程知识,完成目标模块代码实现方案的设计。某社区委托技术公司开发一种社区团购系统,用于疫情防控时,小区居民团购物资。该系统将物资的类型划分为生活必需物资(Living Materials)、生活改善物资(Improved Materials)和生活奢侈品(Luxury Materials),每种类型的物资都有物资名称、价格、库存数量等属性。此外,生活必需物资还具有限购数量(MaxCount)属性,生活奢侈品还具有商品证书(Product Certification)属性。该系统的录入物资模块向用户提供录入物资信息的功能和界面。当用户在录入物资界面,录入一条物品的信息后,点击“录入”按钮,系统将会检查输入的物品信息是否有效。若有效,该条数据保存在数据库的物资表中。否则,使用对话框提示用户“输入的物品信息不满足要求”。
(1)请你根据上述说明,使用 Java 语言设计录入物资模块实现类的基本代
码框架。要求:使用英文单词或词组给所设计的类命名(驼峰格式,首字母大写),
定义出部分类的属性或方法(不要求实现方法体),包含必要的代码注释。
(2)指出你在题目(1)设计的类中哪些可以设计为抽象类或接口,并说明
设计理由。(备注:至少设计出 1 个抽象类或接口)
(3)请描述题目(1)中设计类的对象之间调用关系。(提示:当用户开始与
软件交互时,“什么类型的对象调用另外一种类型对象,完成该模块中的什么业
务处理”为思路)

答:

(1)

/**
*物资类
*/
public class Materials{
protected String name;//物资名称
protected float price;//物资价格
protected availableNumber;//物资库存数量
}/**
*生活必需物资类
*/
public class LivingMaterials extends Materials{
private short maxCount;//限购数量
}/**
*生活改善物资类
*/
public class ImprovedMaterials extends Materials{
}/**
*生活奢侈品类
*/
public class LuxuryMaterials extends Materials{
private String productCertification;//商品证书
}/**
*录入物品界面窗口
*/
public class RecordMaterialsGUI extends JFrame{
}/**
*录入按钮的事件监听器
*/
public class RecordListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//按钮事件处理
} }/**
*信息验证类
*/
public class Validator{ }/**
*数据库访问类
*/
public class DBDAO{
}/**
*提示对话框
*/
public class ValidatorDialog extends JDialog{ }

(2)
Materials 类可以设计为抽象类,因为 LivingMaterials、ImprovedMaterials、LuxuryMaterials
具有共同的属性物资名称、价格、库存数量,可以使用 Materials 作为其泛化类型封装这些
属性的定义,从而实现代码复用。
Validator 类可以设计为抽象接口,因为在系统中不仅需要验证物品信息的有效性,也需要验
证其他数据的有效性,通过定义 Validator 接口作为验证类实现的方法模板,能够保证所有
验证类代码的一致性。
DBDAO 也可以设计为抽象类,用于实现数据库访问代码的复用等。
(3)
当用户录入物品信息后,在录入物资界面点击“录入”按钮时,RecordMaterialsGUI 类
的对象调用 Materials、LivingMaterials、ImprovedMaterials、LuxuryMaterials 等类型对象封装
物品数据,并触发 RecordListener 类的对象进行录入物品的事件处理。RecordListener 类型的
对象调用 Validator 类型对象对数据进行验证,并对验证结果进行判断。如果验证结果有效,
RecordListener 类型的对象则调用 DBDAO 类型对象连接数据库,将数据写入数据表。否则,
RecordListener 类型的对象调用 ValidatorDialog 类型的对象显示“输入的项目数据不满足要
求”的对话框提示信息。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangkay88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值