、不定项选择题(共10小题,每题3分,共30分)
1、以下选项中是对一个Java源文件进行正确编译的语句是( A )。
A. javac Test.java
B. javac Test
C. java Test
D. java Test.class
2、以下选项中属于合法的Java标识符的是( CD )。
A. public
B. 3num
C. name
D. _age
3、while循环和do-while循环的区别是( D )。
A. 没有区别,这两个结构在任何情况下效果一样
B. while循环比do-while循环执行效率高
C. while循环是先循环后判断,所以循环体至少被执行一次
D. do-while循环是先循环后判断,所以循环体至少被执行一次
4、以下语句中关于Java构造方法的说法错误的是( B )。
A. 构造方法的作用是为创建对象进行初始化工作,比如给成员变量赋值
B. 一个Java类可以没有构造方法,也可以提供1个或多个构造方法
C. 构造方法与类同名,不能书写返回值类型
D. 构造方法的第一条语句如果是super(),则可以省略,该语句作用是调用父类无参数的构造方法
5、以下关于this和super关键字的说法错误的是( BD )。
A. this关键字指向当前对象自身,super关键字指向当前对象的直接父类
B. 在main方法中可以存在this或super关键字。
C. this和super关键字都可以访问成员属性,成员方法和构造方法
D. 在一个类的构造方法中可以同时使用this和super来调用其他构造方法
6、以下选项中关于int和Integer的说法错误的是( BD )。
A. int是基本数据类型,Integer是int的包装类,是引用数据类型
B. int的默认值是0,Integer的默认值也是0
C. Integer可以封装了属性和方法提供更多的功能
D. Integer i=5;该语句在JDK1.5之后可以正确执行,使用了自动拆箱功能
7、以下选项中关于Java集合的说法错误的是( AC )。
A. List接口和Set接口是Collections接口的两个子接口
B. List接口中存放的元素具有有序,不唯一的特点
C. `具有无序,不唯一的特点
D. Map接口存放的是映射信息,每个元素都是一个键值对
8、在JAVA中,下列哪些说法是正确的( AC )
A. java源文件的扩展名为.java
B. 写好的java源程序可以直接运行
C. 编写的源程序必须先编译后才能运行
D. 程序员可以读懂扩展名为.class的文件
9、下面哪些赋值语句是正确的?( ABD )
A. long l = 012;//正确,八进制数
B. float f = -412;//正确
C. int i = (int) true;//布尔型不能强转成整型
D. double d = 0x12345678;//正确,在double的范围内。十六进制数
10、下面哪些函数是public void aMethod(){…}的重载函数?( BD )
A. void aMethod( ){…}
B. public int aMethod(int a, float b){…}
C. public void aMethod (){…}
D. public float aMethod (int m){…}
二、简答题(共10小题,每题5分,共50分)
1、JRE、JDK、JVM分别是什么?三者之间有什么联系?
答:JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和开发工具包。
JRE :英文名称(Java Runtime Environment),我们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。jvm 是 Java 能够跨平台的核心。
这三者的关系是:一层层的嵌套关系,JDK 包含 JRE,JRE 包含 JVM;
2、Java中的基本类型有哪些?它们的字节数,bit数分别是多少?
答:Java中的基本数据类型只有8个:
byte(1个字节,8bit)、short(2个字节,16bit)、int(4个字节,32bit)、long(8个字节,64bit)、
float(4个字节,32bit)、double(8个字节,64bit)、char(2个字节,16bit)、boolean(1个字节,8bit)
3、是否可以继承String类,为什么?
答:String 类是final类,不可以被继承。
4、逻辑运算符中&和&&的相同点和不同点?
答:相同点:Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false。
不同点:&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;&则两个表达式都执行。
5、String、StringBuilder、StringBuffer之间的区别?
答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的,一旦修改 String的值就是隐形的重建了一个新的对象,释放了原 String对象。而StringBuffer/StringBuilder类表示的字符串对象可变的,可以直接进行修改。StringBuilder是Java 5中引入的,线程不安全,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
6、接口是否可以继承(extends)接口?抽象类是否可以实现(implements)接口?抽象类是否可以继承具体类?
答:接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
7、阐述静态变量和实例变量的区别?
答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
8、List、Map、Set三个接口存取元素时,各有什么特点?
答:List以特定索引来存取元素,有序,可以有重复元素。Set无序,不能存放重复元素(用对象的equals()方法来区分元素是否复)。Map保存键值对(key-value pair)映射。
9、阐述final、finally、finalize的区别。
答:
final:修饰符(关键字)有三种用法:1、类被声明为final,意味着它不能再派生出新的子类,即不能被继承;2、将变量声明为final,可以保证它们在使用中不被改变;被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。3、被声明为final的方法不能在子类中被重写。
finally:通常放在try…catch…的后面,finally块中的代码总能执行,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
finalize:是在对象被销毁之前会执行一次
10、阐述流的分类。
答:
1.输入流和输出流
按照流的流向来分,可以分为输入流和输出流。输入、输出都是从程序运行所在内存的角度来划分的。
输入流:只能从中读取数据,而不能向其写入数据。由InputStream和Reader作为基类
输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类
2.字节流和字符流
字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
字节流操作的数据单元是8位的字节,由InputStream和OutputStream作为基类。
字符流操作的数据单元是16位的字符,由 Reader和 Writer作为基类。
3.节点流和处理流
按照流的角色来分,可以分为节点流和处理流。
节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流。
三、编程题(共2小题,每题20分,共40分)
注意:本大题需要把源码粘贴在对应题目下方,并且需要录制运行过程和运行结果视频。
1、假设1701班有40个学生,学号为170101170140,全部参加Java集合阶段检测,给出所有同学的成绩(整数、随机产生,范围为50100),请编写程序将本班各位同学成绩从高往低排序打印输出。
注:成绩相同时学号较小的先打印;要求:①打印的信息包含学号、姓名(姓名统一为“同学X”[X=01,02,03,…]和学号后两位一致)和成绩,具体格式参考截图。②遍历输出时使用迭代器
答:参考代码:
package com.gx.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class TestOne {
public static void main(String[] args) {
List<StudentOne> listStudent = new ArrayList<>();
Random random = new Random();
// 生成40个学生,并随机生成成绩
for (int i = 0; i < 40; i++) {
StudentOne student = new StudentOne();
student.setId(170101 + i);
String name = "";
if (i + 1 < 10) {
name = "同学 0" + (i + 1);
} else {
name = "同学 " + (i + 1);
}
student.setName(name);
// 注意这个随机范围 ,要能取到100
int score = random.nextInt(51) + 50;
student.setScore(score);
// 把学生添加到list中
listStudent.add(student);
}
// 对list进行排序
Collections.sort(listStudent);
// 使用迭代器遍历输出list
Iterator<StudentOne> iterator = listStudent.iterator();
while (iterator.hasNext()) {
StudentOne studentOne = iterator.next();
System.out.println("学号:" + studentOne.getId()
+ ",姓名:" + studentOne.getName()
+ ",成绩:" + studentOne.getScore());
}
}
}
class StudentOne implements Comparable {
private int id;// 学号
private String name;// 姓名
private int score;// 成绩
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public int compareTo(StudentOne o) {
if (this.score != o.score) {
return o.score - this.score;
} else {
return this.id - o.id;
}
}
}
或者:
package com.gx.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class TestOne {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
Random random = new Random();
// 生成40个学生 并随机生成成绩
for (int i = 0; i < 40; i++) {
int number = 20190101 + i;
String name = "同学 ";
if (i < 9) {
name += "0" + (i + 1);
} else {
name += (i + 1);
}
int score = random.nextInt(51) + 50;
Student student = new Student(number, name, score);
// 添加到list
students.add(student);
}
// 排序
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if (o1.getScore() != o2.getScore()) {
return o2.getScore() - o1.getScore();
} else {
return o1.getNumber() - o2.getNumber();
}
}
});
// 使用迭代器迭代
Iterator<Student> iterator = students.iterator();
while (iterator.hasNext()) {
Student student = iterator.next();
System.out.println("学号:" + student.getNumber() + ",姓名:" + student.getName() + ",成绩:" + student.getScore());
}
}
}
class Student {
/**
* 学号
/
private int number;
/*
* 姓名
/
private String name;
/*
* 成绩
*/
private int score;
public Student(int number, String name, int score) {
super();
this.number = number;
this.name = name;
this.score = score;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
2、使用IO流的知识,复制文件夹。
要求:复制文件夹中的所有文件、目录,且保持目录结构不变
答:参考代码
package com.gx.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestTwo {
public static void main(String[] args) throws IOException {
copyDir("D:/mycode/java2017", "E:/z/java2017");
System.out.println("复制完成!");
}
/**
* 复制目录
一定涉及到递归
* @param fromDir
* @param toDir
* @throws IOException
*/
public static void copyDir(String fromDir, String toDir)
throws IOException {
// 创建目录的File对象
File dirSouce = new File(fromDir);
// 判断源目录是不是一个目录
if (!dirSouce.isDirectory()) {
// 如果不是目录那就不复制
return;
}
// 创建目标目录的File对象
File destDir = new File(toDir);
// 如果目的目录不存在
if (!destDir.exists()) {
// 创建目的目录
destDir.mkdir();
}
// 获取源目录下的File对象列表
File[] files = dirSouce.listFiles();
for (File file : files) {
//拼接新的fromDir(fromFile)和toDir(toFile)的路径
String strFrom = fromDir + File.separator
+ file.getName();
String strTo = toDir + File.separator
+ file.getName();
// 判断File对象是目录还是文件
// 判断是否是目录
if (file.isDirectory()) {
//递归调用 复制目录的方法
copyDir(strFrom, strTo);
}
// 判断是否是文件
if (file.isFile()) {
System.out.println("正在复制文件: "+file.getName());
//调用 复制文件的方法
copyFile(strFrom, strTo);
}
}
}
/**
* 复制文件
* @param fromFile
* @param toFile
* @throws IOException
*/
public static void copyFile(String fromFile, String toFile)
throws IOException {
//字节输入流--读取文件
FileInputStream in = new FileInputStream(fromFile);
//字节输出流--写入文件
FileOutputStream out = new FileOutputStream(toFile);
//把读取到的内容写入新文件
//把字节数组设置大一些 1*1024*1024=1M
byte[] bs = new byte[1*1024*1024];
int count = 0;
while ((count = in.read(bs)) != -1) {
out.write(bs, 0, count);
}
//关闭流
in.close();
out.flush();
out.close();
}
}