《Java基础入门第2版》课后答案及其详解

本书从初学者的角度详细讲解了Java基础中的核心技术。全书共11章,包括Java开发环境的搭建及其运行机制、基本语法、面向对象的思想、常用API、集合、I/O、GUI、JDBC、多线程和网络编程等内容。使用通俗易懂的语言对每个知识点进行阐述,并结合典型、翔实的案例进行演示说明。

一、填空题

1.Java的三大体系分别是()()和()。 Java EE、Java SE、Java ME

解析:对应教材第1页,针对不同的开发市场,Sun公司将Java划分为三个技术平台,它们分别是Java SE、Java EE和Java ME。

2.Java程序的运行环境简称为()。 JRE

解析:对应教材第4页,JRE:是Java程序的运行环境。

3.编译Java程序需要使用()命令。 javac

解析:对应教材第6页,Javac.exe(Java编译器)

4.javac.exe和java.exe两个可执行程序存放在JDK安装目录的()目录下。 bin

解析:对应教材第6页,bin目录: 该目录用于存放一些可执行程序,如javac.exe(Java编译器)、java.exe(Java运行工具)、jar.exe(打包工具)和javadoc.exe(文档生成工具)等。

5.()环境变量用来存储Java的编译和运行工具所在的路径,而()环境变量则用来保存Java虚拟机要运行的”.class”文件路径。path classpath

解析:对应教材第7页,还可以将javac和java两个可执行文件所在的路径添加到PATH环境变量中
对应教材第9页,CLASSPATH环境变量也用于保存一系列路径,当Java虚拟机需要运行一个类时,会在CLASSPATH环境变量时所定义的路径下寻找所需要的class文件和类包。

二、判断题

1.通过Java虚拟机可以在不同的操作系统上运行Java程序,从而实现跨平台特性。() √对

解析:对应教材第13页,通过上面的分析不难发现,Java程序时是Java虚拟机负责解释执行的,而并非操作系统。这样做的好处是可以实现Java程序的跨平台运行。也就是说,在不同的操作系统上,可以运行相同的Java程序,秩序安装不同版本的Java虚拟机即可。

2.JRE中包含了Java基础类库、JVM和开发工具。() ×错

解析:对应教材第5页右下角的图1-5,可以清楚的看明白开发工具并不包含在JRE中。

3.Java中的包是专门用来存放类的,通常功能相同的类存放在相同的包中。() √对

解析:对应教材第22页,Java中的包是专门用来存放类的,通常功能相同的类存放在相同的包中。

4.java.util包含Java中大量工具类、集合类等,例如Arrays、List、Set等。() √对

解析:对应教材第22页,java.util: 包含Java中大量工具类、集合类等,例如Arrays、List、Set等。

5.Java语言和C语言一样,是面向过程的语言。 () ×错

解析:对应教材第2页,Java将一切事物都看成对象,通过面向对象的方式,将现实世界的事物抽象成对象,将现实世界中的关系(如父子关系)抽象为继承。这种面向对象的方法,更利于人们对复杂程序的理解、分析、设计和编写。

三、选择题

1.以下选项中,哪些属于JDK工具?(多选)() ABCD
A.Java编译器 B.Java运行工具 C.Java文档生成工具 D.Java打包工具

解析:对应教材第6页,bin目录: 该目录用于存放一些可执行程序,如javac.exe(Java编译器)、java.exe(Java运行工具)、jar.exe(打包工具)和javadoc.exe(文档生成工具)等。

2.Java属于以下哪种语言?() C
A.机器语言 B.汇编语言 C.高级语言 D.以上都不对

解析:对应教材第1页,Java是一种高级计算机语言。

3.下面哪种类型的文件可以在Java虚拟机中运行?() D
A. .java B. jre C. .exe D. .class

解析:对应教材第12页,③编译结束后,会自动生成一个HelloWorld.class的字节码文件。
④使用”java HelloWorld”命令启动Java虚拟机运行程序,Java虚拟机首先将编译好的字节码文件加载到内存,这个过程被称为类加载,它是由类加载器完成的,然后虚拟机通过Java解析器对加载到内存中的Java类进行解释执行。

4.安装好JDK后,在其bin目录下由许多exe可执行文件,其中java.exe命令的作用是以下哪一种?() B
A.Java文档制作工具 B.Java解释器 C.Java编译器 D.Java启动器

解析:java.exe:Java解释器,直接从类文件执行Java应用程序代码;

5.如果jdk的安装路径为d:\jdk,若想在命令窗口中任何当前路径下,都可以直接使用javac和java命令,需要将环境变量path设置为以下哪个选项?() B
A.d:\jdk ; B.d:\jdk\bin ; C.d:\jre\bin ; D.d:\jre ;

解析:对应教材第7页,可以将javac和java两个可执行文件所在的路径添加到PATH环境变量中,这样就饿可以在系统的任何位置对Java程序编译和运行了。
我们知道javac和java两个可执行文件所在的路径就是在jdk安装目录的bin目录下,所以选B。

四、简答题

1.简述Java的特点。
面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。

2.简述JRE与JDK的区别。
JRE(Java Runtime Environment,Java运行时环境),它相当于操作系统部分,提供了Java程序运行时所需要的基本条件和许多Java基础类,例如,IO类、GUI控件类、网络类等。JRE是提供给普通用户使用的,如果你只想运行别人开发好的Java程序,那么,你的计算机上必须且只需安装JRE。
JDK(Java Development Kit,Java开发工具包),它包含编译工具、解释工具、文档制作工具、打包工具多种与开发相关的工具,是提供给Java开发人员使用的。初学者学习和使用Java语言时,首先必须下载和安装JDK。JDK中已经包含了JRE部分,初学者安装JDK后不必再去下载和安装JRE了。

3.简述Java的运行机制。
Java程序运行时,必须经过编译和运行两个步骤。首先将后缀名为.java的源文件进行编译,生成后缀名为.class的字节码文件,然后Java虚拟机将字节码文件进行解释执行,并将结果显示出来。

五、编程题

使用记事本编写一个HelloWorld程序,并在命令行窗口编译运行,并打印输出结果。

在这里插入图片描述
在这里插入图片描述

一、填空题

1.布尔常量即布尔类型的两个值,分别是()和()。 true false

解析:对应教材第32页,布尔类型变量用来存储布尔值,在Java中用boolean表示,该类型的变量只有两个值,即true和false

2.Java中的变量可分为两种数据类型,分别是()和()。 基本数据类型和引用数据类型

解析:对应教材30页,在Java中变量的数据类型分为两种:基本数据类型和引用数据类型。

3.在逻辑运算符中,运算符()和()用于表示逻辑与,()和()用于表示逻辑或。(1)& (2)&& (3)| (4)||

解析:对应教材第44页和45页,可从表2-9中得知&与 &&短路与 |或 ||短路或。

4.若”int a = 2;a+=3;“执行后,变量a的值为()。 5

解析: a+=3;这条语句相当于a=a+3;所以a=2+3,注意此=不是等于号,而是赋值号。在Java中,单个”=“表示赋值,两个”=”表示相等。

5.若int[3][2]={{123,345},{34,56},{34,56}},则a[2][1]=()。 56

解析:数组与常见数字序列不同,数组从”0″开始,常见的从”1″开始。因此a[2][1]是第三组第二个,也就是56。

二、判断题

1.Java语言不区分大小写。() ×错

解析:对应教材第26页,(2)Java语言是严格区分大小写的。

2.0xC5表示的是一个十六进制整数。() √对

解析:对应教材第41页,0xC5表示的是一个十六进制整数,此数转换为十进制整数的结果为197。

3.continue语句只用于循环语句中,它的作用是跳出循环。() ×错

解析:对应教材第63页,continue语句用在循环语句中,它的作用是终止本次循环,执行下一次循环。题中的描述显然是break。

4.”/* … * /“中可以嵌套”//“注释,但不能嵌套”/* . . . * /”注释。 () √对

解析:对应教材第27页,(1)多行注释中可以嵌套使用单行注释(2)多行注释中不能嵌套使用多行注释。

5.-5%3的运算结果是2。 ×错

解析: 取余运算时,最终结果的正负符号和%左边的数的正负符号一致。

三、选择题

1.以下选项中,哪些属于合法的标识符?(多选) ( ) AD
A.Hello_World B.class C.123username D.username123

解析:对应教材第28页和29页,B选项class是关键字不能作为标识符,C选项不能以数字开头。故选AD

2.以下关于变量的说法错误的是?() C
A.变量名必须是一个有效的标识符
B.变量在定义时可以没有初始值
C.变量一旦被定义,在程序中的任何位置都可以被访问
D.在程序中,可以将一个byte类型的值赋给一个int类型的变量,不需要特殊声明

解析:对应教材第36页,变量需要在它的作用范围内才可以被使用,这个作用范围被称为变量的作用域。

3.假设int x= 2,三元表达式x>0?x+1:5的运行结果是以下哪一个?() C
A.0 B.2 C.3 D.5

解析:对应教材第48页,? : 是三元运算符,其语法格式如下: (boolean_expr)?true_statement:false_statement。先对布尔类型表达式进行判断,如果正确就执行冒号左边的表达式,如果错误就执行冒号右边的表达式。
先对布尔类型表达式进行判断,也就是题中x>0,x=2所以x>0正确,故执行x+1,也就是2+1=3。

4.以下哪个选项可以正确创建一个长度为3的二维数组?( )B
A.new int[2][3]; B.new int[3][ ]; C.new int [ ][3];D.以上答案皆不对

解析:A选项创建了一个长度为2,每个数组的元素个数为3的二维数组
B选项创建了一个长度为3的二维数组
C选项创建的方式有误。

5.请先阅读下面的代码。

int x = 1;
		int y = 2;
		if(x%2==0) {
		y++;
		}else{
		y--;
		}
		System.out.println("y="+y);

上面一段程序运行结束时,变量y的值为下列哪一项?( ) A
A.1 B.2 C.3 D.0

解析:从第三行代码 if(x%2==0)开始分析,x对2进行取余,如果等于0,y自增1,如果不等于0,y自减1。
题中x=1,对2取余结果为1,所以执行else下的语句,也就是y–;y自减1,所以输出的y应为1,故选A。

四、简答题

1.请列举Java语言中的8种基本数据类型,并说明每种数据类型所占用的空间大小。
Java语言的八种基本数据类型有:byte字节型,占一个字节。short短整型,占两个字节。int整型,占4个字节。long长整型,占8个字节。float单精度浮点型,占4个字节。double双精度浮点型,占8个字节。char字符型,占两个字节。boolean型,表示逻辑值,有true和false两个值,分别占一个字节。

2.简述&&与&的区别并举例说明。
如果使用“&”在表达式之间进行连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用“&&”进行连接,当“&&”左边的表达式为false,则不会执行其右边的表达式。例如定义int x = 2,y = 0; boolean b = x < y & x / 2 > 0表达是会发生被0除异常,因为x / y的表达式执行了。而boolean b = x < y & x / 2 > 0是不会出现这种异常的,因为x < y为false,表达式x / y不会执行。

3.简述跳转语句break和continue的作用和区别。
作用:break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
continue结束本次循环,继续下一次循环。
区别:break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循
环中剩余的语句。(break语句也在switch语句中使用)
continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行
下一次是否执行循环的判定。

五、编程题

1.请编写程序,实现计算”1+3+5+7+…+99″的值。要求如下:
(1)使用循环语句实现自然数1-99的遍历
(2)在遍历过程中,通过条件判断当前遍历的数是否为奇数,如果是就累加,否则不加。

//创建一个类名为getSum的类
public class getSum {
//主函数
	public static void main(String[] args) {
	//定义sum为累加的总和,并定义初始值为0
		int sum = 0;
		//for循环,i初始值为1,最大取值为99,每次自增1
		for (int i = 1; i < 100; i++) {
		//每次都输出一次i的值,实现了对自然数1-99的遍历
		System.out.println("i="+i);
		//判断当前数是否为奇数,如果是就执行sum +=i;
			if (i % 2 != 0){
			//当数为奇数时,sum就累加。
				sum += i;
		}
		}
		//输出sum的值,也就是累加总和的值
		System.out.println(sum);
	}
}

解析:看注释,每一条语句都给了详细的注释。

2.请使用冒泡排序算法编写程序,实现对数组{25,24,12,76,101,96,28}的排序。

//定义一个类名为ArraySort的类
public class ArraySort {
//主函数
	public static void main(String[] args) {
	//定义数组
		int[] arr = { 25, 24, 12, 76, 101, 96, 28 };
		//定义外层循环
		for (int i = 0; i < arr.length - 1; i++) {
			// 定义内层循环,由于冒泡排序每次都是将最大的数排到最右侧,最大的数已经排好了位置,
			//无需再排序,所以每次循环都要比上一次循环少比较一次,所以j<arr.length - i - 1
			for (int j = 0; j < arr.length - i - 1; j++) {
			// 比较相邻元素
				if (arr[j] > arr[j + 1]) { 
					// 下面的三行代码用于交换两个元素
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
	}
		}
		//定义for循环,对排序完成后的数组进行逐个输出。
		for (int i = 0; i < arr.length; i++) {
		// 打印元素和空格
			System.out.print(arr[i] + " "); 
		}
	}
}

解析:先看解析,看不懂对照教材第71页的例2-24 Example24.java进行理解。

一、填空题

1.面向对象的三大特征是( )、( )和( ) 封装、继承、多态

2.在非静态成员方法中,可以使用关键字( )访问类的其他非静态成员 this

3.在Java中,针对类、成员方法和属性提供了四种访问级别,分别是( )、( )、( )和( ) private、default、protected、public

4.被static关键字修饰的成员变量被称为( ),它可以被该类所有的实例对象共享。 静态变量

5.所谓类的封装是指在定义一个类时,将类中的属性私有化,即使用( )关键字来修饰。 private

二、判断题

1.在定义一个类的时候,如果类的成员被private所修饰,该成员不能在类的外部被直接访问。()

2.Java中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。()

3.声明构造方法时,不能使用private关键字修饰。()

4.类中static修饰的变量或方法,可以使用类名或对象的引用变量访问。()

5.静态代码块会随着类对象的创建而执行。()

三、选择题

1.下面哪一个是正确的类的声明?()D
A.public void HH{…} B.public class Move(){…} C.public class void number{.} D.public class Car{…}

2.下面对于构造方法的描述,正确的有哪些?(多选)()ABC
A.方法名必须和类名相同
B.方法名的前面没有返回值类型的声明
C.在方法中不能使用return语句返回一个值
D.当定义了带参数的构造方法,系统默认的不带参数的构造方法依然存在

3.在Java中,针对类和提供了4种访问级别,以下控制级别由小到大依次列出正确的是()A
A.private、default、protected和public
B.default、private、protected和public
C.protected、default、private和public
D.protected、private、default和public

4.请先阅读下面的代码

public class Test{
public Test(){
System.out.println("构造方法一被调用了");
}
public Test(int x){
System.out.println("构造方法二被调用了");
}
public Test(boolean b){
this(1);
System.out.println("构造方法三被调用了");
}
public static void main(String[]args){
Test test = new Test(true);
}
}

上面程序的运行结果为下列哪一项?() D
A.构造方法一被调用了 B.构造方法二被调用了 C.构造方法三被调用了 D.以上三个选项之和

5.以下关于static关键字的说法正确的是?(多选)() BD
A.static关键字可以修饰类

B.static关键字可以修饰成员

C.static关键字可以修饰所有的变量

D.static关键字可以修饰代码块

四、简答题

1.简述构造方法和普通的成员方法有什么区别

构造方法是类的一个特殊成员,它会在类实例化对象时被自动调用。而普通方法只有在使用的时候才会被调用。在定义构造方法时要求方法名与类名相同、在方法名的前面没有返回值类型的声明、在方法中不能使用return语句返回一个值。

2.简述Java中构造方法须同时满足的条件

  • 方法名与类名相同;
  • 在方法名的前面没有返回值类型的声明;
  • 在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束。

3.简述Java面向对象特性。

Java面向对象有三大特性,封装是将对象的属性和行为封装起来,不需要让外界知道具体实现细节;继承是可以在无需重新编写原有类的情况下,对原有类的功能进行扩展;多态指的是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。

五、编程题

1.请按照以下要求设计一个学生类Student,并进行测试。要求如下:
(1)Student类中包含姓名、成绩两个属性。
(2)分别给这两个属性定义两个方法,一个方法用于设置值,另一个方法用于获取值。
(3)Student类中定义一个无参的构造方法和一个接收两个参数的构造方法,两个参数分别为姓名和成绩属性赋值。
(4)在测试类中创建两个Student对象,一个使用无参的构造方法,然后调用方法给姓名和成绩赋值,另一个使用有参的构造方法,在构造方法中给姓名和成绩赋值。

class Student {
	private String name;
	private double grade;
	public Student() {
	}
	public Student(String name, double grade) {
		this.name = name;
		this.grade = grade;
	}
	public String getName() {
		return name;
	}
public void setName(String name) {
		this.name = name;
	}
	public double getGrade() {
		return grade;
	}
	public void setGrade(double grade) {
		this.grade = grade;
	}
}
public class Test01 {
	public static void main(String[] args) {
		Student stu1 = new Student();
		stu1.setName("zhangsan");
		stu1.setGrade(99);
		Student stu2 = new Student("lisi", 100);
	}
}

2.定义一个这样的数列:0,1,1,2,3,5,…(斐波那契数列)。要求如下:
使用递归方法获取第n个数的数值。

public class Test {
	public static void main(String[] args) {
		int n = 8;
		int num = getNum(n);
		System.out.println("第"+n+"个数的数值是:"+num);
	}
    public static int getNum(int n) {  
        if (n == 1){
        	return 0;  
        } else if (n == 2 || n == 3) {
        	return 1; 
        } else {
        	return getNum(n - 1) + getNum(n - 2);  
        }
    }  
}

一、填空题

1.一个类如果实现一个接口,那么它就需要实现接口中定义的全部( ),否则该类就必须定义成()。 方法 抽象类

2.一个类可以从其他的类派生出来,派生出来的类称为(),用于派生的类称为()或者()。子类 父类 基类

3.定义一个Java类时,如果前面加使用( )关键字修饰,那么该类不可以被继承。final

4.在Java语言中,所有的类都直接或间接继承自()类。Object

5.一个Lambda表达式由三个部分组成,分别为()、()和()。参数列表、“->”、表达式主体

二、判断题

1.抽象方法必须定义在抽象类中,所以抽象类中的方法都是抽象方法。() 错×

2.Java中被final关键字修饰的变量,不能被重新赋值。() 对√

3.不存在被继承关系的情况下,也可以实现方法重写。() 错×

4.函数式接口在Java中是指由且仅有一个抽象方法的接口。()对√

5.接口中只能定义常量和抽象方法。() 对√

三、选择题

1.在类的继承关系中,需要遵循以下哪个继承原则?()B
A.多重 B.单一 C.双重 D.不能继承

2.关于super关键字以下说法哪些是正确的?(多选)()ABC
A.super关键字可以调用父类的构造方法
B.super关键字可以调用父类的普通方法
C.super与this不能同时存在于同一个构造方法中
D.super与this可以同时存在于同一个构造方法中

3.类中的一个成员方法被下面哪个修饰符修饰,该方法只能在本类被访问?()C
A.public B.protected C.private D.default

4.在Java中,要想让一个类继承另一个类,可以使用以下哪个关键字?()C
A.inherits B.implements C.extends D.modifies

5.已知类的继承关系如下:

class Employee;
class Manager extends Employee;
class Director extends Employee;

则以下语句能通过编译的有哪些?()A
A.Employee e = new Manager();
B.Director d = new Manager();
C.Director d = new Employee();
D.Manager m = new Director();

四、简答题

1.简述什么是方法重写。
在继承关系中,子类的方法与父类的某一方法具有相同的方法名、返回类型和参数列表,则称子类的该方法重写(覆盖)父类的方法。

2.简述什么是多态。
多态意味着一个对象有着多种形态,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。简单的说,多态就是使用父类类型的变量引用子类对象,根据被引用子类对象的特性,程序会得到不同的运行效果。

3.简述抽象类和接口的区别。
在Java中,使用abstract关键字修饰的类称之为抽象类。抽象类是不能被实例化的,通常需要写一个子类来继承抽象类,同时实例化子类来获得该类的对象。抽象类通常用于表示一种抽象的概念。
接口可以说是一种特殊的抽象类,接口中只能定义常量、抽象方法、静态方法和默认方法。由于接口的特殊性,在定义时需要使用interface关键字。

五、编程题

1.设计一个学生类Student和它的一个子类Undergraduate。要求如下:
(1)Student类有name和age属性,一个包含两个参数的构造方法,用于给name和age属性赋值,一个show()方法打印Student的属性信息。
(2)本科生类Undergraduate增加一个degree(学位)属性。有一个包含三个参数的构造方法,前两个参数用于给继承的name和age属性赋值,第三个参数给degree专业赋值,一个show()方法用于打印Undergraduate的属性信息。
(3)在测试类中分别创建Student对象和Undergraduate对象,调用它们的show()。

class Student {
	public String name;
	public int age;
	public Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	public void show(){
		System.out.println("name: "+name+" age: "+age);
	}
}
class UnderGraduate extends Student{
	public String degree;
	public UnderGraduate(String name,int age,String degree){
		super(name, age);
		this.degree=degree;
	}
	public void show(){
		System.out.println("name: "+name+" age: "+age+" degree: "+degree);
	}
}
public class Test01{
	public static void main(String[] args) {
		Student student = new Student("zhangsan", 16);
		student.show();
		UnderGraduate underGraduate = new UnderGraduate("lisi", 20, "bechalor");
		underGraduate.show();
	}
	}

2.设计一个Shape接口和它的两个实现类Square和Circle。要求如下:
(1)Shape接口中有一个抽象方法area(),方法接收有一个double类型的参数,返回一个double类型的结果。
(2)Square和Circle中实现了Shape接口的area()抽象方法,分别求正方形和圆形的面积并返回。
在测试类中创建Square和Circle对象,计算边长为2的正方形面积和半径为3的圆形面积。

interface Shape {
	double area(double givenValue);
}
class Square implements Shape{
	public double area(double sideLength) {
      return sideLength*sideLength;
	}
} 
class Circle implements Shape{
	public double area(double r) {
       return Math.PI*r*r;
	}
}
public class Test02 {
	public static void main(String[] args) {
		Shape square = new Square();
		Shape circle = new Circle();
		System.out.println(square.area(2));
		System.out.println(circle.area(3));
	}
}

一、填空题

1.在Java中定义了两个类来封装对字符串的操作,它们分别是()和()。String StringBuffer

2.Java中的操作日期的类有()、()和()等。Date Calendar DateFormat

3.Java中专门用于将日期格式化为字符串的类是()。DateFormat

4.System类中所提供的属性和方法都是()的,想要引用这些属性和方法,直接使用System类调用即可。静态

5.已知sb为StringBuffer的一个实例,且sb.toString()的值为’abcde’,则执行sb.reverse()后,sb.toString的值为()。edcba

二、判断题

1.String对象和StringBuffer对象都是字符串变量,创建后都可以修改。()错×

2.用运算符==比较字符串对象时,如果两个字符串的值相同,结果为true。()错×

3.System类中的currentTimeMillis()方法返回一个long类型的值。()对√

4.Date、Calendar以及DateFormat类都位于java.util包中。()错×

5.String类的方法replace(CharSequence srt1,CharSequence srt2)返回一个新的字符串,它是通过用srt2替换此字符串中出现的所有srt1得到的。()对√

三、选择题

1.以下都是Math类的常用方法,其中用于计算绝对值的方法是哪个?()C
A.ceil() B.floor() C.abs() D.random()

2.String s = “abcdedcba”;则s.substring(3,4)返回的字符串是以下哪个选项中的哪个?()C
A. cd B.de C.d D.e

3.要产生[20,999]之间的随机整数可以使用以下哪个表达式?()B
(本题的星号改为了×,星号在Markdown编辑器中有不同的含义。)
A.(int)(20+Math.random()×97)
B.20+(int)(Math.random()×980)
C.(int)Math.random()×999
D.20+(int)Math.random()×980

4.下面的程序执行后,输出的结果是以下哪个选项?()A

StringBuffer buf = new StringBuffer("Beijing2008");
buf.insert(7,"@");
System.out.println(buf.toString());

A.Beijing@2008 B.@Beijing2008
C.Beijing2008@ D.Beijing#2008

5.先阅读下面的程序片段:

String str1 = new String("java");
String str2 = new String("java");
StringBuffer str3 = new StringBuffer("java");

对于上述定义的变量,以下表达式的值为true的是哪个?()B
A.str1 = = str2; B.str1.equals(str2);
C.str1 = = str3; D.以上都不对

四、简答题

1.简述String和StringBuffer有什么区别。
String类是不可变类,即字符串值一旦初始化后就不可能改变。StringBuffer是可变字符串类,类似String的缓冲区,可以修改字符串的值。

2.简述Date和Calender类有什么区别和联系。
Date类用来表示某个特定的瞬间,能够精确到毫秒。而在实际应用中,往往需要把一个日期中的年、月、日等信息单独返回进行显示或处理,这个类中的大部分方法都已被标记过时。Calender类基本取代了Date类,该类中定义了一系列用于完成日期和时间字段操作的方法。
Calendar的getTime()方法,getTime()返回一个表示Calendar时间值的Date对象,同时Calendar有一个setTime(Date date)方法,setTime()方法接收一个Date对象,将Date对象表示的时间值设置给Calendar对象,通过这两个方法就可以完成Date和Calendar对象之间的转换。


3.简述什么是自动装箱和自动拆箱。
自动装箱是指将基本数据类型的变量赋给对应的包装类变量,反之,拆箱是指将包装类对象类型 直接赋给一个对应的基本数据类型变量。

五、编程题

1.编写一个程序,实现字符串大小写的转换并倒序输出。要求如下:
(1)使用for循环将字符串”HelloWorld”从最后一个字符开始遍历。
(2)遍历的当前字符如果是大写字符,就使用toLowerCase()方法将其转换为小写字符,反之则使用toUpperCase()方法将其转换为大写字符。
(3)定义一个StringBuffer对象,调用append()方法依次添加遍历的字符,最后调用StringBuffer对象的toString()方法,并将得到的结果输出。

public class Test01 {
	public static void main(String[] args) {
		String str = "HelloWorld";
		// 字符串转成char数组
		char[] ch = str.toCharArray();
		StringBuffer buffer = new StringBuffer();
		for (int i = str.length() - 1; i >= 0; i--) {
			if (ch[i] >= 'A' && ch[i] <= 'Z') {
				buffer.append(String.valueOf(ch[i]).toLowerCase());
			} else if (ch[i] >= 'a' && ch[i] <= 'z') {
				buffer.append(String.valueOf(ch[i]).toUpperCase());
			}
		}
		System.out.println(buffer.toString());
	}
}

2.利用Random类来产生5个20~30之间的随机整数。

提示:[n-m] (n、m均为整数,n<m)之间的随机数的公式为n+(new Random () ).nextInt(m-n+1)

import java.util.Random;
public class Test {
	public static void main(String[] args) {
		Random rand = new Random();
		for (int i = 0; i < 5; i++) {
			int num = 20 + rand.nextInt(11);
			System.out.println(num);
		}
	}
}

一、填空题

1.在创建TreeSet对象时,可以传入自定义比较器,自定义比较器需实现()接口。Comparator

2.使用Interator遍历集合时,首先需要调用()方法判断是否存在下一个元素,若存在下一个元素,则调用()方法取出该元素。
hashNext() next()

3.Map集合中的元素都是成对出现的,并且都是以()、()的映射关系存在。键 值

4.List集合的主要实现类有()、(),Set集合的主要实现类有()、(),Map集合的主要实现类有()、()。
ArrayList、LinkedList,HashSet、TreeSet,HashMap、TreeMap

5.在JDK8中,根据Lambda表达式特性还增加了一个()方法来遍历集合。forEach(Consumer action)

二、判断题

1.Set集合是通过键值对的方式来存储对象的。() 错×

2.集合中不能存放基本数据类型,而只能存放引用数据类型。()对√

3.如果创建的TreeSet集合中没有传入比较器,则该集合中存入得元素需要实现Comparable接口。()对√

4.使用Iterator迭代集合元素时,可以调用集合对象的方法增删元素。()

5.JDK8中增加的一个Stream接口,该接口可以将集合、数组中的元素转换为Stream流的形式。()对√

三、选择题

1.要想保存具有映射关系的数据,可以使用以下哪些集合?(多选)( ) BC
A.ArrayList B.TreeMap C.HashMap D.TreeSet

2.使用Iterator时,判断是否存在下一个元素可以使用以下哪个方法?( ) D
A.next() B.hash() C.hasPrevious() D.hasNext()

3.在程序开发中,经常会使用以下哪个类来存储程序中所需的配置?( ) C
A.HashMap B.TreeSet C.Properties D.TreeMap

4.要想在集合中保存没有重复的元素并且按照一定的顺序排列,可以使用以下哪个集合?( ) D
A.LinkedList B.ArrayList C.hashSet D.TreeSet

5.以下哪些方法是LinkedList集合中定义的?(多选)( ) ABC
A.getLast( ) B.getFirst( )
C.remove(int index) D.next( )

四、简答题

1.简述什么是集合并列举集合中常用的类和接口。
为了使程序能方便的存储和操作数目不固定的一组数据,JDK提供了一套类库,这些类都位于java.util包中,统称为集合。集合框架中常用的接口和类有,List、Set、ArrayList、HashSet、Map、HashMap、TreeMap。

2.简述集合中的List、Set、Map有什么区别。
List的特点是元素有序、可重复。List接口的主要实现类有ArrayList和LinkedList。Set的特点是元素无序、不可重复。Set接口的主要实现类有HashSet和TreeSet。Map的特点是存储的元素是键(Key)、值(Value)映射关系,元素都是成对出现的。Map接口的主要实现类有HashMap和TreeMap。

3.简述Collection和Collections的区别。
Collection是一个单例集合接口。它提供了对集合对象进行基本操作的通用方法。Collections是一个工具类。它包含各种有关集合操作的方法。

五、编程题

1.在HashSet集合中添加三个Person对象,把姓名相同的人当做同一个人,禁止重复添加。要求如下:
Person类中定义name和age属性,重写hashCode( )方法和equals( )方法,针对Person类的name属性进行比较,如果name相同,hashCode( )方法的返回值相同,equals( )方法返回true。

import java.util.*;
public class Test02 {
	public static void main(String[] args) {
		HashSet hashSet = new HashSet();
		Person p1 = new Person("Jack",25);
		Person p2 = new Person("Rose",23);
		Person p3 = new Person("Jack",27);
		hashSet.add(p1);
		hashSet.add(p2);
		hashSet.add(p3);
		for(Object obj:hashSet){
			Person p=(Person)obj;
			System.out.println(p.name+":"+p.age);
		}
	}
}
class Person{
	String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public int hashCode() {
	   return name.hashCode();
	}
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
		return false;
		Person p = (Person) obj;
		return p.name.equals(this.name);
	}
}	
123456789101112131415161718192021222324252627282930313233343536

2.选择合适的Map集合保存5位学员的学号和姓名,然后按学号的自然顺序的倒序将这些键值对一 一打印出来。要求如下:
(1)创建TreeMap集合。
(2)使用put方法将学号(“1” “2” “3” “4” “5”)和姓名(“Lucy” “John” “Smith” “Aimee” “Amanda”)存储到Map中,存的时候可以打乱顺序观察排序后的效果。
(3)使用map.keySet()获取键的Set集合。
(4)使用Set集合的iterator( )方法获得Iterator对象用于迭代键。
(5)使用Map集合的get( )方法获取键所对应的值。

import java.util.*;
public class Test03 {
	public static void main(String[] args) {
		TreeMap map = new TreeMap(new MyComparator());
		map.put("1", "Lucy");
		map.put("2", "Lucy");
		map.put("3", "John");
		map.put("4", "Smith");
		map.put("5", "Amanda");
		for (Object key : map.keySet()) {
			System.out.println(key + ":" + map.get(key));
		}
	}
}
class MyComparator implements Comparator {
	public int compare(Object obj1, Object obj2) {
		String ele1 = (String) obj1;
		String ele2 = (String) obj2;
		return ele2.compareTo(ele1);
	}
}

一、填空题

1.Java中的I/O流,按照传输数据不同,可分为( )和( )。字节流 字符流

2.在Buffer和Channel交互时,数据会从( )读取到( )中,或从Buffer写入到Channel中。Channel Buffer

3.用于将字节流转换为字符流的是( )和( )。InputStreamReader OutputStreamWriter

4.NIO主要有三大核心部分:( )、( )和( )。Buffer Channel Selector

5.Java中提供了一个类( ),它不但具有读写文件的功能,而且可以随机地从文件的任何位置开始执行读写数据的操作。RandomAccesseFile

二、判断题

1.如果一个File表示目录下有文件或者子目录,调用delete( )方法也可以将其删除。()错×

2.对象序列化是指讲一个Java对象转换成一个I/O流中字节序列的过程。()对√

3.Channel是一个接口对象,它类似于传统的流对象。()对√

4.InputStream类的close( )方法是用于关闭流并且释放流所占的系统资源。()对√

5.BufferedInputStream和BufferedOutputStream不是字节缓冲流。()错×

三、选择题

1.下面选项中,哪些是标准输入输出流?(多选)( ) AB
A.System.In B.System.Out C.InputStream D.OutputStream

2.File类中以字符串形式返回文件绝对路径的方法是哪一项?( ) C
A.getParent( ) B.getName( )
C.getAbsolutePath( ) D.getPath

3.以下创建RandomAccessFile类实例对象的代码,哪些是正确的?(多选)( ) AB
A.new RandomAccessFile(new File(“D:\itcast\dirl\test.java”),“rw”);
B.new RandomAccessFile(“D:\itcast\dirl\test.java”,“r”);
C.new RandomAccessFile(“D:\itcast\dirl\test.java”);
D.new RandomAccessFile(“D:\itcast\dirl\test.java”,“wr”)

4.以下选项中,哪个流使用了缓冲区技术?( ) A
A.BufferOutputStream B.FileInputStream
C.DataOutputStream D.FileReader

5.以下选项中,关于Java NIO中Buffer类的常用说法正确的是哪一项?( )B
A.clear( )方法会清除缓冲区数据,并将position设置为0,limit设置为capacity
B.flip( )方法先将limit设置为当前position位置,然后再将position设置为0
C.mark( )方法用于设置Buffer的标记(mark),只能在0与limit之间做标记
D.rewind( )方法将position设置为0,并设置mark标记

四、简答题

1.简述I/O流的概念。Java程序通过I/O流来完成输入和输出,流是输入或输出信息的抽象。流通过Java的输入/输出系统与外设连接进行数据通信。流是抽象的对象,具体实现代码在java.io包中。

2.简述字节流、字符流的区别。
字节流的两个基类是InputStream和OutputStream,字符流的两个基类是Reader和Writer,它们都是Object类的直接子类,字节流是处理以8位字节为基本单位的字节流类;Reader和Writer类是专门处理16位字节的字符流类。

3.简要说明什么是NIO。
Java中的NIO是为替代传统标准的I/O而出现的。与标准的IO相比,Java NIO提供了一种与I/O不同的工作方式。NIO采用内存映射文件的方式来处理输入/输出,它将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了。
在标准IO中,使用的是字节流和字符流,而在NIO中,使用的是通道(Channel)和缓冲区(Buffer)。数据总是从通道读入缓冲区,或从缓冲区写入通道。
NIO主要有三大核心部分:Buffer、Channel和Selector。其中Buffer可以被看成是一个容器,其本质是一个数组缓冲区,读入或写出到Channel中的所有对象都会先放在Buffer中;Channel是对传统的输入/输出的模拟,在NIO中,所有的数据都需要通过通道流的形式传输;Selector(选择器)用于监听多个通道的事件(例如:连接打开、数据到达等),主要用于多线程处理。

五、编程题

1.编写一个程序,分别使用字节流和字符流拷贝一个文本文件。要求如下:
(1)使用FileInputStream、FileOutputStream和FileReader、FileWriter分别进行拷贝。
(2)使用字节流拷贝时,定义一个1024长度的字节数组作为缓冲区,使用字符流拷贝,使用BufferedReader和BufferedWriter包装流进行包装。

import java.io.*;
public class Test01 {
	public static void main(String[] args) throws Exception {
		// 字节流拷贝
		FileInputStream in = new FileInputStream("E:/src.txt");
		FileOutputStream out = new FileOutputStream("E:/des1.txt");
		byte[] buf = new byte[1024];
		int len;
		while ((len = in.read(buf)) != -1) {
			out.write(buf, 0, len);
		}
		in.close();
		out.close();
		// 字符流拷贝
		BufferedReader bf = new BufferedReader(new FileReader("E:/src.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("E:/des2.txt"));
		String str;
		while ((str = bf.readLine()) != null) {
			bw.write(str);
			bw.newLine();
		}
		bf.close();
		bw.close();
	}
}

2.某人在玩游戏的时候输入密码123456后成功进入游戏(输错5次则被强行退出),要求用程序实现密码验证的过程。要求如下:
(1)使用System.in包装为字符流读取键盘输入。
(2)BufferedReader对字符流进行包装。调用BufferedReader的readLine( )方法每次读取一行。
(3)在for循环中判断输入的密码是否为123456,如果是则打印”恭喜你进入游戏”,并跳出循环,否则继续循环读取键盘输入。
(4)当循环完毕,密码还不正确,则打印”密码错误,结束游戏”,并调用System.exit(0)方法结束程序。

import java.io.*;
public class Test02 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String password = "";
		boolean b = false;
		for (int i = 0; i < 5; i++) {
			System.out.println("请输入密码:");
			password = br.readLine();
			if (password.equals("123456")) {
				System.out.println("恭喜你进入游戏");
				b = true;
				break;
			}
		}
		if (!b) {
			System.out.println("密码错误,游戏结束");
			System.exit(0);
		}
	}
}

一、填空题

1.在Java中,图形用户界面简称( )。 GUI

2.( )负责监听事件源上发生的事情,并对各种事情做出响应处理。事件监听器

3.GUI设计提供了一些基本的图形用户接口开发工具,如AWT、( )和JavaFX。Swing

4.如果单击Frame窗口右上角的关闭按钮能将其关闭,那么这个Frame窗口添加了( )添加器,并实现了监听器的( )方法。
WindowListener 、windowClosing(WindowEvent e)

5.创建下拉式菜单需要使用三个组件,分别是( )、( )和( )。JMenuBar、JMenu、JMenuItem

二、判断题

1.容器(Container)是一个可以包含基本组件和其他容器的组件。( )对√

2.可以通过实现ActionListener接口或者继承ActionAdapter类来实现动作事件监听器。( )错×

3.CardLayout布局管理器将界面看做一系列卡片,在任何时候只有其中一张卡片是可见的。( )对√

4.非模态对话框是指用户需要等到处理完对话框后才能继续与其他窗口进行交互。( )错×

5.JFrame的默认布局管理器是FlowLayout。( )错×

三、选择题

1.下面四个组件中哪一个不是JComponent的子类?( ) B
A.JButton B.JDialog C.JLabel D.JMenuBar

2.下面四个选项中,哪些是事件处理机制中的角色?(多选)( ) ABD
A.事件 B.事件源
C.事件接口 D.事件监听器

3.ActionEvent的对象会被传递给以下哪个事件处理方法?( ) D
A.addChangeListener( ) B.addActionListener( )
C.stateChanged( ) D.actionPerformed( )

4.下面哪些是FlowLayout类中表示对齐方式的常量?(多选)( ) ABD
A.FlowLayout.LEFT B.FlowLayout.CENTER
C.FlowLayout.VERTICAL D.FlowLayout.RIGHT

5.下列选项中关于JavaFX,描述错误的是( )。 C
A.JavaFX是一个强大的图形和多媒体处理工具包集合
B.JavaFX允许开发者来设计、创建、测试、调试和部署客户端程序
C.JavaFX不能与Swing实现互操作
D.JavaFX可以实现跨平台功能

四、简答题

1.请简述GUI中实现事件监听的步骤。
通过实现XxxListener接口或者继承XxxAdapter类实现一个事件监听器类,并对处理监听动作的方法进行重写
创建事件源对象和事件监听器对象
调用事件源的addXxxLisntener()方法,为事件源注册事件监听器对象


2.请简述Swing中的布局管理器有哪些。
Swing工具在AWT的基础上提供了8种布局管理器,分别为BorderLayout(边界布局管理器)、BoxLayout(箱式布局管理器)、CardLayout(卡片布局管理器)、FlowLayout(流式布局管理器)、GridBagLayout(网格包布局管理器)、GridLayout(网格布局管理器)、GroupLayout(分组布局管理器)和SpringLayout(弹性布局管理器)。

3.Swing事件处理的过程中涉及哪些对象。
事件源(Event Source):事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等。
事件对象(Event):封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。
监听器(Listener):负责监听事件源上发生的事件,并对各种事件做出相应处理的对象(对象中包含事件处理器)。

五、编程题

1.编写一个JFrame窗口,要求如下:
(1)在窗口的最上方放置一个JLable标签,标签中默认的文本是”此处显示鼠标右键单击的坐标”。
(2)为JFrame窗口添加一个鼠标事件,当鼠标右键单击窗口时,鼠标的坐标在JLabel标签中显示。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyMouseHandler extends JFrame {
	public MyMouseHandler() {
		final JLabel label = new JLabel("此处显示鼠标右键点击的坐标");
		label.setOpaque(true);
		label.setBackground(Color.PINK);
		this.add(label, BorderLayout.NORTH);
		this.setSize(300, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (e.getButton() == MouseEvent.BUTTON1) {
					int x = e.getX();
					int y = e.getY();
					String banner = "鼠标当前点击位置的坐标是" + x + "," + y;
					label.setText(banner);
				}
			}
		});
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new MyMouseHandler();
	}
}

2.编写一个JFrame窗口,要求如下:
(1)窗口中的NORTH区域中放置一个JPanel面板。
(2)JPanel面板中从左到右依次放置如下组件:
①1个JLabel标签,标签的文本为”兴趣”。
②3个JCheckBox多选按钮,文本分别为”羽毛球”“乒乓球”“唱歌”。
③1个JLabel标签,标签的文本为”性别”
④两个JRadioButton,文本分别为”男”“女”
(3)窗口中的CENTER区域放置一个JScrollPane容器,容器中放置一个JTextArea文本域。
(4)当单击多选按钮和单选按钮时,会把选中按钮的文本显示在JTextArea文本域中。

import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
public class Information extends JFrame {
	// 窗口NORTH部的JPanel面板 
	private JPanel panel = new JPanel();
	// 爱好标签
	private JLabel lb1 = new JLabel("兴趣");
	// 三个表示爱好的JCheckBox复选框
	private JCheckBox cb1 = new JCheckBox("羽毛球");
	private JCheckBox cb2 = new JCheckBox("乒乓球");
private JCheckBox cb3 = new JCheckBox("唱歌");
	// 性别标签
	private JLabel lb2 = new JLabel("性别");
	// 表示性别的JRadioButton单选框
	private JRadioButton rb1 = new JRadioButton("男");
	private JRadioButton rb2 = new JRadioButton("女");
	// ButtonGroup添加JRadioButton,实现单选功能
	private ButtonGroup bg = new ButtonGroup();
	// 文本域组件
	private JTextArea area = new JTextArea();
	// 窗口CENTER部的JScrollPane面板,其中放置area文本域 
	private JScrollPane pane = new JScrollPane(area);
	// Set集合存放选中的兴趣
	private Set<String> hobbies = new HashSet<String>();
	// gender选中的性别
	private String gender = "";
	// JCheckBox复选框的事件监听器
	private ActionListener listener1 = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			JCheckBox cb = (JCheckBox) e.getSource();
			// 选中的复选框把文本添加到Set集合中
			if (cb.isSelected()) {
				hobbies.add(cb.getText());
			//  反之从集合中移除
			} else {
				hobbies.remove(cb.getText());
			}
			print();
		}
	};
	// JRadioButton单选框的事件监听器
	private ActionListener listener2 = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			JRadioButton jb = (JRadioButton) e.getSource();
			gender = jb.getText();
			print();
		}
	};
    // 打印方法
	private void print() {
		// 清空文本域
		area.setText("");
		// 如果Set集合中有元素,打印兴趣
		if (hobbies.size() > 0)
area.append("你的兴趣爱好有: ");
		Iterator<String> it = hobbies.iterator();
		while (it.hasNext()) {
			area.append(it.next() + " ");
		}
		// 如果gender不为空字符串,打印性别
		if (!"".equals(gender))
			area.append("你的性别为: " + gender);
	}
	public Information() {
		//添加标签、单选和复选按钮
		panel.add(lb1);
		panel.add(cb1);
		panel.add(cb2);
		panel.add(cb3);
		panel.add(lb2);
		panel.add(rb1);
		panel.add(rb2);
		bg.add(rb1);
		bg.add(rb2);
		// 为单选和复选按钮添加事件监听器
		cb1.addActionListener(listener1);
		cb2.addActionListener(listener1);
		cb3.addActionListener(listener1);
		rb1.addActionListener(listener2);
		rb2.addActionListener(listener2);
		// 将JPanel面板和JScrollPane面板添加到JFrame容器中 
		Container container = this.getContentPane();
		container.add(panel, BorderLayout.NORTH);
		container.add(pane, BorderLayout.CENTER);
		this.pack();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new Information();
	}
}

一、填空题

1.JDCB是( )的缩写,简称Java数据库连接。Java Database Connectivity

2.JDBC API主要位于( )包中。 java.sql.*

3.在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的( )中。classpath

4.DriverManager类的( )方法可用于向DriverManager中注册给定的JDBC驱动程序。registerDriver( )

5.在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前,调用( )方法可将游标移动到下一行。next( )

二、判断题

1.JDBC(Java Database Connectivity,Java 数据库连接),它是一套用于执行SQL语句的Java API。( )对√

2.Statement是Java执行数据库操作的一个重要接口,它用于执行动态的SQL语句,并返回一个结果对象。( )错×

3.PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。( )对√

4.PreparedStatement接口中的setData( )方法可以设置日期内容,但参数Date的类型必须是java.util.Date。( )错×

5.ResultSet接口既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从0开始编号的。( )
错×

三、选择题

1.JDBC是一套用于执行什么的Java API ? ( ) A
A.SQL语句 B.数据库连接
C.数据库操作 D.数据库驱动

2.当应用程序使用JDBC访问特定的数据库时,只需要通过不同的什么与其对应的数据库进行连接,连接后即可对数据库进行响应的操作? ( ) C
A. Java API B.JDBC API
C.数据库驱动 D.JDBC驱动

3.JDBC API主要位于哪个包中,该包定义了一系列访问数据库的接口和类?( ) A
A.java.sql B.java.util
C.java.jdbc D.java.lang

4.在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的什么位置?( ) D
A.根目录下 B.JDBC程序所在目录下
C.任意目录下 D.classpath

5.下面是Statement接口中常用的执行SQL语句的方法,哪些说明是正确的?(多选)( ) AC
A.execute(String sql)用于执行各种SQL语句,该方法返回一个boolean类型的值
B.executeUpdate(String sql)用于执行SQL中的query、insert、update和delete语句
C.executeQuery(String sql)用于执行SQL中的select语句
D.executeUpdate(String sql)用于执行各种SQL并返回int类型结果

四、简答题

1.请简述什么是JDBC。
答:JDBC是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作。

2.简述JDBC的编程步骤。
(1)加载数据库驱动
(2)通过DriverManager获取数据库连接
(3)通过Connection对象获取Statement对象
(4)使用Statement执行SQL语句
(5)操作ResultSet结果集
(6)关闭连接,释放资源


3.简述PreparedStatement相比Statement优点。
(1)代码的可读性和可维护性
(2)PreparedStatement尽最大可能提高性能,因为预编译语句有可能被重复调用,所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。
(3)极大地提高了安全性传。递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配;在公共Web站点环境下,防止Sq注入问题。

五、编程题

1.编写一个JDBC程序,要求如下:
(1)查询tb_user表数据进行操作,表设计可参考9.3.2节表。
(2)使用JDBC分别完成数据的插入、修改、查询和删除操作。

public static void main(String[] args) throws Exception {
		// int i = insert();
		// int i = delete();
		// int i = update();
		select();
		// System.out.println(i);
	}

	// 获取连接对象
	private static Connection getConn() {
		String driver = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/javatest";
		String username = "root";
		String password = "1234";
		Connection conn = null;
		try {
			Class.forName(driver); // classLoader,加载对应驱动
			conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	// 插入操作
	private static int insert() {
		Connection conn = getConn();
		int i = 0;
		String sql = "insert into tb_user(name,sex,email,birthday) values(?,?,?,?)";
		PreparedStatement pstmt;
		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "itcast");
			pstmt.setString(2, "男");
			pstmt.setString(3, "itcast@126.com");
			pstmt.setString(4, "2000-01-01");
			i = pstmt.executeUpdate();
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return i;
	}

	// 删除操作
	private static int delete() {
		Connection conn = getConn();
		int i = 0;
		String sql = "delete from tb_user where name=?";
		PreparedStatement pstmt;
		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "itcast");
			i = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return i;
	}
// 更新操作
	private static int update() {
		Connection conn = getConn();
		int i = 0;
		String sql = "update tb_user set name=? where name =?";
		PreparedStatement pstmt;
		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "itcast");
			pstmt.setString(2, "abc");
			i = pstmt.executeUpdate();
			System.out.println("resutl: " + i);
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return i;
	}

	// 查询操作
	private static void select() {
		Connection conn = getConn();
		String sql = "select * from tb_user";
		PreparedStatement pstmt;
		try {
			pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				int id = rs.getInt("id"); // 通过列名获取指定字段的值
				String name = rs.getString("name");
				String sex = rs.getString("sex");
				String email = rs.getString("email");
				Date birthday = rs.getDate("birthday");
				System.out.println(id + "	|	" + name + "	|	" + sex + "	|	" + email + "	|	" + birthday);
			}
			pstmt.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

2.编写一个JDBC程序,要求如下:
(1)设计一个tb_count表,表设计可参考9.3.2节表,并加上int类型的money字段。
(2)使用JDBC连接MySQL数据库插入两条数据,在不考虑事务的情况下完成两个用户之间的转账功能。

import java.sql.*;
public class Test {
	public static void main(String[] args) throws Exception {
		transferAccounts(2, 1, 100);
	}
	public static void transferAccounts(int fromid,int toid,int transferMoney) throws 
Exception{
		Class.forName("com.mysql.jdbc.Driver");
		String url = "jdbc:mysql://localhost:3306/jdbc";
		Connection con = DriverManager.getConnection(url,"root", "root");
		int fromMoney = getMoney(fromid);
		// 转出账户
		String sql = "update tb_count set money=? where id =?";
		PreparedStatement ps = con.prepareStatement(sql);
		ps.setInt(1, fromMoney-transferMoney);
		ps.setInt(2, fromid);
		// 转入账户
		int toMoney = getMoney(toid);
		String sql2 = "update tb_count set money=? where id =?";
		PreparedStatement ps2 = con.prepareStatement(sql2);
		ps2.setInt(1, toMoney+transferMoney);
		ps2.setInt(2, toid);
		ps.executeUpdate();
		ps2.executeUpdate();
		ps.close();
		ps2.close();
		con.close();
	}
	// 获取当前账户id的账户余额
	public static int getMoney(int id) throws Exception{
		Class.forName("com.mysql.jdbc.Driver");
		String url = "jdbc:mysql://localhost:3306/jdbc";
		Connection con = DriverManager.getConnection(url,"root", "root");
		String sql = "select money from tb_count where id =?";
		PreparedStatement ps = con.prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet resultSet = ps.executeQuery();
		int money = 0;
		while(resultSet.next()){
			money = resultSet.getInt(1);
		}
		ps.close();
		con.close();
	return money;
	}
}

THE END
喜欢就支持以下吧
点赞6赞赏
分享
评论 抢沙发

请登录后发表评论