1.去掉 main 方法的 static 修饰符,程序会怎样?
A:程序无法编译
B:程序正常编译,正常运行
C:程序正常编译,正常运行一下马上退出
D:程序正常编译,运行时报错
答:D
题目解析:运行时异常如下:
错误: main 方法不是类 xxx 中的 static, 请将 main 方法定义为:
public static void main(String[] args)
2.以下程序运行的结果是?
public class TestClass {
public static void main(String[] args) {
System.out.println(getLength());
}
int getLength() {
private String s = "xyz";
int result = s.length();
return result;
}
}
复制
A:3
B:2
C:4
D:程序无法编译
答:D
题目解析:局部变量 s 不能使用任何修饰符(private/protected/public)修饰,调用的方法要加上 static,否则编译会报错。
3.以下程序有几处错误?
abstract class myAbstractClass
private abstract String method(){};
}
复制
A:1
B:2
C:3
D:4
答:C
题目解析:类少一个“{”类开始标签、抽象方法不能包含方法体、抽象方法访问修饰符不能为 private,因此总共有 3 处错误。
4.以下程序执行的结果是?
class A {
public static int x;
static {
x = B.y + 1;
}
}
public class B {
public static int y = A.x + 1;
public static void main(String[] args) {
System.out.println(String.format("x=%d,y=%d", A.x, B.y));
}
}
复制
A:程序无法编译
B:程序正常编译,运行报错
C:x=1,y=2
D:x=0,y=1
答:C
5.switch 语法可以配合 return 一起使用吗?return 和 break 在 switch 使用上有何不同?
答:switch 可以配合 return 一起使用。return 和 break 的区别在于 switch 结束之后的代码,比如以下代码:
String getColor(String color) {
switch (color) {
case "red":
return "红";
case "blue":
return "蓝";
}
return "未知";
}
String getColor(String color) {
String result = "未知";
switch (color) {
case "red":
result = "红";
break;
case "blue":
result = "蓝";
}
return result;
}
复制
对于以上这种 switch 之后没有特殊业务处理的程序来说,return 和 break 的效果是等效的。然而,对于以下这种代码:
String getColor(String color) {
switch (color) {
case "red":
return "红";
case "blue":
return "蓝";
}
return "未知";
}
String getColor(String color) {
String result = "未知";
switch (color) {
case "red":
result = "红";
break;
case "blue":
result = "蓝";
}
if (result.equals("未知")) {
result = "透明";
} else {
result += "色";
}
return result;
}
复制
如果 switch 之后还有特殊的业务处理,那么 return 和 break 就有很大的区别了。
6.一个栈的入栈顺序是 A、B、C、D、E 则出栈不可能的顺序是?
A:E D C B A
B:D E C B A
C:D C E A B
D:A B C D E
答:C
题目解析:栈是后进先出的,因此:
A 选项:入栈顺序 A B C D E 出栈顺序就是 E D C B A 是正确的;
B 选项:A B C D 先入栈,D 先出栈,这个时候 E 在入栈,E 在出栈,顺序 D E C B A 也是正确的;
C 选项:D 先出栈,说明 A B C 一定已入栈,因为题目说了入栈的顺序是 A B C D E,所以出栈的顺序一定是 C B A,而 D C E A B 的顺序 A 在 B 前面是永远不可能发生的,所以选择是 C;
D 选项 A B C D E 依次先入栈、出栈,顺序就是 A B C D E。
7.可以在 finally 块中使用 return吗?
答:不可以,finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句。
8.FileInputStream 可以实现什么功能?
A:文件夹目录获取
B:文件写入
C:文件读取
D:文件夹目录写入
答:C
题目解析:FileInputStream 是文件读取,FileOutputStream 才是用来写入文件的,FileInputStream 和 FileOutputStream 很容易搞混。
9.以下程序打印的结果是什么?
Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("I'm T1.");
}
};
t1.setPriority(3);
t1.start();
Thread t2 = new Thread(){
@Override
public void run() {
System.out.println("I'm T2.");
}
};
t2.setPriority(0);
t2.start();
复制
答:程序报错 java.lang.IllegalArgumentException,setPriority(n) 方法用于设置程序的优先级,优先级的取值为 1-10,当设置为 0 时,程序会报错。
10.如何设置守护线程?
答:设置 Thead 类的 setDaemon(true) 方法设置当前的线程为守护线程。
守护线程的使用示例如下:
Thread daemonThread = new Thread(){
@Override
public void run() {
super.run();
}
};
// 设置为守护线程
daemonThread.setDaemon(true);
daemonThread.start();
复制
11.以下说法中关于线程通信的说法错误的是?
A:可以调用 wait()、notify()、notifyAll() 三个方法实现线程通信
B:wait() 必须在 synchronized 方法或者代码块中使用
C:wait() 有多个重载的方法,可以指定等待的时间
D:wait()、notify()、notifyAll() 是 Object 类提供的方法,子类可以重写
答:D
题目解析:wait()、notify()、notifyAll() 都是被 final 修饰的方法,不能再子类中重写。选项 B,使用 wait() 方法时,必须先持有当前对象的锁,否则会抛出异常 java.lang.IllegalMonitorStateException。
12.ReentrantLock 默认创建的是公平锁还是非公平锁?
答:默认创建的是非公平锁,看以下源码可以得知:
/**
- Creates an instance of {@code ReentrantLock}.
- This is equivalent to using {@code ReentrantLock(false)}.
*/
public ReentrantLock() {
sync = new NonfairSync();
}
复制
Nonfair 为非公平的意思,ReentrantLock() 等同于代码 ReentrantLock(false)。
13.ReentrantLock 如何在一段时间内无阻塞尝试访问锁?
答:使用 tryLock(long timeout, TimeUnit unit) 方法,就可以在一段时间内无堵塞的访问锁。
14.枚举比较使用 equals 还是 ==?
答:枚举比较调用 equals 和 == 的结果是一样,查看 Enum 的源码可知 equals 其实是直接调用了 ==,源码如下:
public final boolean equals(Object other) {
return this==other;
}
复制
15.在 Spring 中使用 @Value 赋值静态变量为什么 null?怎么解决?
答:因为在 Springframework 框架中,当类加载器加载静态变量时,Spring 上下文尚未加载,因此类加载器不会在 bean 中正确注入静态类,导致了结果为 null。可使用 Setter() 方法给静态变量赋值,代码如下:
网友评论