java笔试面试小题
【来源: 牛客网 】
1、下列选项输出什么(C)
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
my360DW();
}
};
t.run();
System.out.print("DW");
}
static void my360DW() {
System.out.print("360");
}
- A、 DW
- B、 360
- C、 360DW
- D、 都不输出
解析如下:
2、下列说法正确的是(AB)?
- A、 对于局部内部类,只有在方法的局部变量被标记为final或局部变量是effctively final的,内部类才能使用它们
- B、 成员内部类位于外部类内部,可以直接调用外部类的所有方法(静态方法和非静态方法)
- C 、由于匿名内部类只能用在方法内部,所以匿名内部类的用法与局部内部类是一致的
- D、静态内部类可以访问外部类的成员变量
解析如下:
3、以下哪几种方式可用来实现线程间通知和唤醒:( AC)
- A、Object.wait/notify/notifyAll
- B、ReentrantLock.wait/notify/notifyAll
- C、Condition.await/signal/signalAll
- D、Thread.wait/notify/notifyAll
解析如下:
wait()、notify()和notifyAll()是 Object类中的方法
从这三个方法的文字描述可以知道以下几点信息:
1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。
2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)
3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;
4)调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模拟线程间协作。
Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用Conditon中的await()对应Object的wait(); Condition中的signal()对应Object的notify(); Condition中的signalAll()对应Object的notifyAll()
4、以下关于 abstract 关键字的说法,正确的是(D)
- A、abstract 可以与final 并列修饰同一个类。
- B、abstract 类中不可以有private的成员。
- C、abstract 类中必须全部是abstract方法。
- D、abstract 方法必须在abstract类或接口中。
解析如下:
5、下面的方法,当输入为2的时候返回值是多少(D)?
public static int getValue(int i) {
int result = 0;
switch (i) {
case 1:
result = result + i;
case 2:
result = result + i * 2;
case 3:
result = result + i * 3;
}
return result;
}
- A、0
- B、2
- C、4
- D、10
解析如下: