复习题.docx
《复习题.docx》由会员分享,可在线阅读,更多相关《复习题.docx(22页珍藏版)》请在冰豆网上搜索。
![复习题.docx](https://file1.bdocx.com/fileroot1/2023-8/19/009c456d-d6fa-415b-96b6-8e6832be1d7f/009c456d-d6fa-415b-96b6-8e6832be1d7f1.gif)
复习题
Java期末复习总结
一、填空题:
注意:
答案红色已标出
1、Java程序的运行环境简称之为__jre________。
2、编译Java程序需要使用___javac______命令。
3、Javac.exe和java.exe两个可执行程序存放在JDK安装目录的___bin_______目录下。
4、Java中的注释可分为三种类型,分别是__单行注释_______、___多行注释_____、__文档注释_______。
5、Java中的变量可分为两种数据类型,分别是__基本数据类型______、___引用数据类型_____。
6、若X=2,则表达式(X++)/3的值是____0______。
7、若inta=2;a+=3;执行后,变量a的值为___5______。
8、若int[]a={12,45,34,46,23},则a[2]=____34_____。
9、面向对象的三大特征是___封装______、___继承_____、____多态_____。
10、定义在类中的变量被称为____成员变量_______,定义在方法中的变量被称为___局部变量_____。
11、在非静态成员方法中,可以使用关键字____this_____访问类的其它非静态成员。
12、在Java中,提供了一个____javadoc_____命令,用于将程序中的文档注释提取出来,生成HTML格式的文档。
13、一个类如实现一个接口,那么它就需要实现接口中定义的全部___方法______,否则该类就必须定义成_____抽象类_______。
14、JDK中定义了大量的异常类,这些类都是____Exception____类的子类或者间接子类。
15、定义一个Java类时,如果前面使用___final____关键字修饰,那么该类不可以被继承。
16、如果子类想继承父类中的成员,可以通过关键字____super_____引用父类的成员。
17、异常的捕获通常由try、catch两部分组成,___try______代码块用来存放可能发
生的异常,____catch_____代码块用来处理产生的异常。
18、一个应用程序中有多条并发执行的线索,每条线索都被称作一个___线程_____,它们会交替执行,彼此间可以进行___通信______。
19、在Java语言中,同步方法需要用到关键字___synchronized______,对于同步方法而言无须指定同步锁,它的同步锁是方法所在的___对象______,也就是___this______(关键字)。
20、在thread类中,提供了一个start()方法,该方法用于__开启一个新线程____,当新线程启动后,系统会自动调用___run()___方法。
21、要将某个线程设置为后台线程,需要调用该线程的____setDaemon(true)______方法,该方法须在____start()_____方法之前调用。
22、在Java中定义了两个类类封装对字符串的操作,它们分别是___String_____和
___StringBuffer____。
23、Math类中用于计算所传递参数平方根的方法是____sqrt()______。
24、Java中专门用于将日期格式化为字符串的类是___DateFormat_____。
25、System类中所提供的属性和方法都是___静态____的,想要引用这些属性和方法,直接使用system类调用即可。
26、Collection有两个子接口分别是list和set,list集合的特点是
_____有序、可重复_____,set集合的特点是___无序、不可重复____。
27、使用iterator遍历集合时,首先需要调用___hashNext()___方法判断是否存在下一个元素,若存在下一个元素,则调用___next()___方法取出该元素。
28、Interator有一个子类,不仅可以对集合进行从前向后遍历,还可以从后向前
遍历,该类是____ListIterator______。
29、Java中的IO流,按照传输数据不同,可分为___字节流___和__字符流__。
30、InputStreamReader类是用于将__字节流__转换为__字符流__。
二、选择题:
注意:
答案红色已标出
1、以下选项中,哪些属于JDK工具?
(多选)()
A、Java编译器
B、Java运行工具
C、Java文档生成工具
D、Java打包工具
2、下面哪种类型的文件可以在Java虚拟机中运行?
()
A、.java
B、.jre
C、.exe
D、.class
3、以下关于变量的说法错误的是?
()
A、方法名必须是一个有效的标识符
B、变量在定义时可以没有初始值
C、变量一旦被定义,在程序中的任何位置都可以被访问
D、在程序中,可将一个byte类型的值赋给一个int类型的变量,不需要特殊声明
4、以下选项中,switch语句判断条件可以接收的数据类型有哪些?
(多选)()
A、int
B、byte
C、char
D、short
5、请先阅读下面的代码。
intx=1;
inty=2;
if(x%2==0){
y++;
}else{
y--;
}
System.out.println(“y=”+y);
上面一段程序运行结束时,变量y的值为下列哪一项?
()
A、1
B、2
C、3
D、switch语句
6、在以下什么情况下,构造方法会被调用?
()
A、类定义时
B、创建对象时
C、调用对象方法时
D、使用对象的变量时
7、下面对于构造方法的描述,正确的有哪些?
(多选)()
A、方法名必须和类名相同
B、方法名的前面没有返回值类型的声明
C、在方法中不能使用return语句返回一个值
D、当定义了带参数的构造方法,系统默认的不带参数的构造方法依然存在
8、关于内部类,下面说法正确的是?
(多选)()
A、成员内部类是外部类的一个成员,可以访问外部类的其它成员
B、外部类可以访问成员内部类的成员
C、方法内部类只能在其定义的当前方法中进行实例化
D、静态内部类中可以定义静态成员,也可以定义非静态成员
9、下面对于单例设计模式的描述,正确的是?
(多选)()
A、类中定义一个无参的构造方法,并且声明为私有
B、在内部创建一个该类的实例对象,使用静态变量引用该实例对象
C、使用private修饰静态变量,禁止外界直接访问
D、定义静态方法返回该类实例
10、Outer类中定义了一个成员内部类Inner,需要在main()方法中创建Inner类实
例对象,以下四种方式哪一种是正确的?
()
A、Innerin=newInner()
B、Innerin=newOuter.Inner();
C、Outer.Innerin=newOuter.Inner();
D、Outer.Innerin=newOuter().newInner();
11、在类的继承关系中,需要遵循以下哪个继承原则?
()
A、多重
B、单一
C、双重
D、不能继承
12、以下说法哪些是正确对的?
(多选)()
A、Java语言中允许一个类实现多个接口
B、Java语言中不允许一个类继承多个类
C、Java语言中允许一个类同时继承一个类并实现一个接口
D、Java语言中允许一个接口继承一个接口
13、关于抽象类的说法哪些是正确的?
(多选)()
A、抽象类中可以有非抽象方法
B、如果父类是抽象类,则子类必须重写父类所有的抽样方法
C、不能用抽象类去创建对象
D、接口和抽象类是同一个概念
14、编译运行下面的程序,结果是什么?
()
PubicclassA{
pubicstaticvoidmain(String[]args){
Bb=newB();
b.test();
}
voidtest(){
Ststem.out.print(“A”);
}
}
classBextendsA{
voidtest();
Super.test();
System.out.print(“B”);
}
}
A、产生编译错误
B、译运行,并输出结果AB
C、代码可以编译运行,但没有输出
D、编译没有错误,但会产生运行时异常
15、Thread类似于下列哪个包中?
()
A、java.io
B、java.lang
C、java.util
D、java,awt
16、关于线程的创建过程,下面四种说法正确的有哪些?
(多选)()
A、定义Thread类的子类,重写Thread类的run()方法,创建该子类的实例对象,
调用对象的start()方法
B、定义Thread类的子类,重写Thread类的run()方法,创建该子类的实例对象,
调用对象的run()方法
C、定义一个实现Runnable接口的类并实现run()方法,创建该类实例对象,将其
作为参数传递给Thread类的构造方法类创建Thread对象,调用Thread对象的
start()方法
D、定义一个实现Runnable接口的类并实现run()方法,创建该类实例对象,然后
调用run()方法
17、对于线程的生命周期,下面四种说法正确的有哪些?
(多选)()
A、调用了线程的start()方法,该线程就进入运行状态
B、线程的run()方法运行结束或未被捕获的InterruptedException等异常终结,
那么该线程进入死亡状态
C、线程进入死亡状态,但是该线程对象任然是一个Thread对象,在没有被垃圾回
收器回收之前仍可以和引用其他对象一样应用它
D、线程进入死亡状态后,调用它的start()方法仍然可以重新启动
18、对于死锁的描述,下面四种说法正确的有哪些?
(多选)()
A、当两个线程相互等待对方释放同步锁时会发生死锁
B、Java虚拟机没有检测和处理死锁的措施
C、一旦出现死锁,程序会发生异常
D、处于死锁状态的线程处于阻塞状态,无法继续运行
19、下列四个选项中,哪些是线程进入阻塞状态的原因?
(多选)()
A、线程试图获取某个对象的同步锁,而该锁被其他线程所持有
B、线程调用了另一个线程的join()方法
C、线程调用了一个阻塞式的IO方法
D、线程调用了setDaemon(Booleanb)方法
20、先阅读下面的程序片段:
Stringstr=”abccdefcdh”;
String[]arr=str.split(“c”);
System.out.println(arr.length);
程序执行后打印的结果是几?
()
A、2
B、3
C、4
D、5
21、假如indexOf()方法未能找到所指定的子字符串,则返回以下哪个?
()
A、false
B、de
C、d
D、以上答案均不对
22、要产生[20,999]之间的随机整数可以使用以下哪个表达式?
()
A、(int)(20+Math.random()*97)
B、20+(int)(Math.random()*980)
C、(int)(Math.random()*999
D、20+(int)(Math.random()*980
23、阅读下面的程序:
PubicclassTest{
Pubicstaticvoidmain(Stringargs[]){
Inti;
Floatf=2.3f;
Doubled=2.7;
I=((int)Math.ceil(f))*((int)Math.round(d));
Ststem.out.println(“i”);
}
}
程序执行后,运行结果为以下哪几个选项?
()
A、9
B、5
C、6
D、6.1
24、要想保存具有映射关系的数据,可以使用以下哪些集合?
(多选)()
A、ArrayList
B、TreeMap
C、HashMap
D、TreeSet
25、关于foreach循环的特点,以下说法哪些是正确的?
(多选)()
A、foreach循环是在遍历集合时,无须获得容器的长度
B、foreach循环是在遍历集合时,无须循环条件,也无需迭代语句
C、foreach循环是在遍历集合时,非常烦琐
D、foreach循环的语法格式为:
for(容器中元素类型临时变量:
容器变量)
26、要想集合中保存的元素没有重复并且按照一定的顺序排列,可使用以下哪个集合?
A、LinkedList
B、ArrayList
C、HashSet
D、TreeSet
27、获取单列集合中元素的个数可以使用以下哪个方法?
()
A、length()
B、size()
C、get(intindex)s
D、add(Objectobj)
28、下列选项中,哪些是标准输入输出流?
(多选)()
A、System.in
B、System.out
C、InputStream
D、OutputStream
三、判断题:
注意:
答案红色已标出
1、Set集合是通过键值对的方式来存储对象的。
(错)
2、使用Iterator迭代集合元素时,可以调用集合对象的方法增删元素。
(对)
四、程序分析题:
注意:
答案红色已标出
阅读下面的程序,分析代码是否能够编译通过,如果能通过,请列出运行结果。
否
则请说明编译失败的原因。
1、代码一:
PublicclassTest01{
pulicstaticvoidmain(String[]args){
byteb=3;
b=b+4;
System.out.println("b="+b);
}
}
1、编译不通过。
int值4和b相加时,由于变量b的类型为byte,取值范围没有int类型大,存不下int类型的值,因此编译不通过。
2、代码二:
PublicclassTest02{
pulicstaticvoidmain(String[]args){
intx=12;
{
inty=96;
System.out.println("xis"+x);
System.out.println("yis"+y);
}
y=x;
System.out.println("xis"+x);
}
}
2、编译不通过。
这是因为y是在最里层的代码块中定义的一个变量,只有在那个代码块中才可使用,在使用y=x;语句时已经超过了y变量的作用域,所以编译无法通过。
3、代码三:
classA{
privateintsecret=5;
}
publicclassTest1{
publicstaticvoidmain(String[]args){
Aa=newA();
System.out.println(a.secret++);
}
}
3、程序不能编译通过,因为在类A中的成员变量secret用private修饰,所以在类Test1中无法访问。
4、代码四:
publicclassOuter{
publicStringname="Outer";
privateclassInner{
Stringname="inner";
voidshowName(){
System.out.println(name);
}
}
publicstaticvoidmain(String[]args){
Innerinner=newOuter().newInner();
System.out.println(inner.name);
}
}
4、程序能够编译通过,运行的结果为“inner”。
5、代码五:
PublicclassTest01{
pulicstaticvoidmain(String[]args){
try{
intx=2/0;
System.out.println(x);
}catch(Exceptione){
System.out.println("进入catch代码块”);
}finally{
System.out.println("进入finally代码块”);
}
}
}
5、程序编译能通过,这是因为intx=2/0;System.out.println(x);这两条语句使用了try块,捕获了程序因为除以0而产生的异常情况,之后程序会继续向下执行,输出“进入catch代码块”,“进入finally代码块”。
6、代码六:
finalclassAnimal{
publicfinalvoidshout(){
//程序代码
}
}
classDogextendsAnimal{
publicvoidshout(){
//程序代码
}
}
classTest02{
publicstaticvoidmain(String[]args){
Dogdog=newDog;
}
}
6、程序编译不通过,这是因为在程序中使用了final关键字修饰Animal类,使得Animal类不能被继承。
shout()方法中同样使用了final关键字,使得该方法不能被重写。
7、代码七:
publicclassAextendsThread{
protectedvoidrun(){
Systemout.println("thisisrun()");
}
Publicstaticvoidmain(String[]args){
Aa=newA();
a.start();
}
}
7、程序不能编译通过,因为Thread的子类A重写的run()方法的访问级别不能低于父类run()方法的。
访问级别
8、代码八
publicclassTest{
privatesynchronizedvoida(){
try{
obj.wait();
System.out.println("waiting");
}cath(InterruptedExceptione){
Systen.out.println("Exception");
}
}
publicstaticvoidmain(String[]args){
newTset().a();
}
}
8、程序不能编译通过,因为同步方法中调用wait()方法的对象必须为同步锁对象。
9、代码九:
publicclass{
publicstaticvoidmain(String[]args){
Strings="dfferghuklmbdfd";
Systen.out.println("str.length():
"+s.length());
Systen.out.println("str.charAt(0):
"+s.charAt(0));
Systen.out.println("lastIndexOf(m):
"+s.lastIndexOf('m'));
Systen.out.println("substring(2,4):
"+s.substring(2,4));
Systen.out.println("indexOf(g):
"+s.indexOf('g'));
}
}
9、程序编译能通过,输出结果如下
str.length():
15
str.charAt(0):
d
lastIndexOf(m):
10
substring(2,4):
fe
indexOf(g):
5
10、代码十:
importjava.util.*;
publicclassTest01{
publicstaticvoidmain(String[]args){
TreeSetts=newTreeSet();
ts.add("b");
ts.add("a");
ts.add("c");
ts.add("c");
Iteratorit=ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
10、程序可以编译通过,输出结果是“a、b、c”,因为TreeSet集合不允许存放重复元素,第2次增加的元素c会覆盖之前存入的元素c,所以输出结果是“a、b、c”,而不是“a、b、c、c”。
11、代码十一:
importjava.util.Arraylist;
publicclassTest02{
publicstaticvoidmain(String[]args){
ArrayListlist=newArrayList();
list.add("a");
list.add("b");
list.add("c");
for(Stringobj:
list){
System.out.println(obj);
}
}
}
11、程序不可以编译通过,这是由于向ArrayList集合中存入元素时,集合并不能记住元素的类型,因此在取出元素时,只能使用Object类型,而不能使用String类型。
五、编程题:
注意:
答案红色已标出
1、请按照以下要求设计一个学生类Student,并进行测试。
要求如下:
①Stduent类中包含姓名、成绩两个属性;
②分别给这两个属性定义两个方法,一个方法用于设置值,另一个方法用于获取值;
③Student类中定义一个无参的构造方法和一个接收两个参数的构造方法,两个参
数分别为姓名和成绩两个属性;
④在测试类中创建两个Student对象,一个使用无参的构造方法,然后调用方法给
姓名和成绩赋值,另一个使用有参的构造方法,在构造方法中给姓名和成绩赋值。
代码如下
classStudent{
privateStringname;
privatedoublegrade;
publicStudent(){
}
publicStudent(Stringname,doublegrade){
this.name=name;
this.grade=grade;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicdoublegetGrade(){
returngrade;
}
publicvoidsetGrade(doubleg