题一
1.如下的Java程序
public class Test {
public static void main(String[] args) {
System.out.println(args[0]);
}
}
若采用命令行“java Test one two three”调用,则程序输出的结果为:
A:Test
B:one
C:two
D:java
正确答案: B
解析:采用命令行“ java Test one two three ”调用
其中Test为调用的方法,而one two three则为Test方法里面main函数的参数;
System.out.println(args[0]);表示输出第一个元素,故为one;
题二
2.volatile关键字的说法错误的是
A:能保证线程安全
B:volatile关键字用在多线程同步中,可保证读取的可见性
C:JVM保证从主内存加载到线程工作内存的值是最新的
D:volatile能禁止进行指令重排序
正确答案: A
volatile到底做了什么
禁止了指令重排
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的
不保证原子性(线程不安全)
出于运行速率的考虑,java编译器会把经常经常访问的变量放到缓存(严格讲应该是工作内存)中,读取变量则从缓存中读。
但是在多线程编程中,内存中的值和缓存中的值可能会出现不一致。volatile用于限定变量只能从内存中读取,
保证对所有线程而言,值都是一致的。但是volatile不能保证原子性,也就不能保证线程安全。
题三
3.在创建派生类对象,构造函数的执行顺序()
A:基类构造函数,派生类对象成员构造函数,派生类本身的构造函数
B:派生类本身的构造函数,基类构造函数,对象成员构造函数
C:基类构造函数,派生类本身的构造函数,派生类对象成员构造函数
D:对象成员构造函数,基类构造函数,派生类本身的构造函数
正确答案:A
解析:父类静态域——》子类静态域——》父类成员初始化——》父类构造块——》
父类构造方法——》子类成员初始化——》子类构造块——》子类构造方法;
题四
4.下面有关servlet中init,service,destroy方法描述错误的是?
A:init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
B:service()方法处理客户机发出的所有请求
C:destroy()方法标志servlet生命周期的结束
D:servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的
正确答案:D
解析
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。
最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,
彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
题五
5.有以下一个对象:
public class DataObject implements Serializable{
private static int i=0;
private String word=" ";
public void setWord(String word){
this.word=word;
}
public void setI(int i){
Data0bject. i=I;
}
}
创建一个如下方式的DataObject:
DataObject object=new Data0bject ( );
object. setWord("123");
object. setI(2);
将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为:
A:"", 0
B:"", 2
C:"123", 2
D:"123", 0
正确答案: D
解析:
Java在序列化时不会实例化static变量和transient修饰的变量,因为static代表类的成员,transient代表对象的临时数据,
被声明这两种类型的数据成员不能被序列化
题六
6.Java7特性中,abstract class和interface有什么区别。
A:抽象类可以有构造方法,接口中不能有构造方法
B:抽象类中可以有普通成员变量,接口中没有普通成员变量
C:抽象类中不可以包含静态方法,接口中可以包含静态方法
D:一个类可以实现多个接口,但只能继承一个抽象类。
正确答案: A B D
解析:
抽象类
特点:
抽象类中可以构造方法
抽象类中可以存在普通属性,方法,静态属性和方法。
抽象类中可以存在抽象方法。
如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
特点:
在接口中只有方法的声明,没有方法体。
在接口中只有常量,因为定义的变量,在编译的时候都会默认加上
public static final
在接口中的方法,永远都被public来修饰。
接口中没有构造方法,也不能实例化接口的对象。
接口可以实现多继承
接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法
则实现类定义为抽象类。
题七
7.下面程序的输出是什么?
public class TestDemo
{
public static String output = "";
public static void foo(inti)
{
try
{
if (i == 1)
{
throw new Exception();
}
}
catch (Exception e)
{
output += "2";
return ;
} finally
{
output += "3";
}
output += "4";
}
public static void main(String[] args)
{
foo(0);
foo(1);
System.out.println(output);
}
}
A:342
B:3423
C:34234
D:323
正确答案: B
解析:
1.执行foo(0)时,不满足try语句块中的if语句,所以不会抛出异常,执行finally语句
2.执行foo(1)时,满足try中的If语句,抛出异常,在catch中进行异常处理,虽然有return语句,
但是finally中的内容必须执行,也就是说要先执行了finally才进行return操作,return后 output += “4”将不会再执行.
题八
8.以下关于final关键字说法错误的是()
A:final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
B:final修饰的类不能被继承
C:final修饰的方法不能被重载
D:final修饰的变量不允许被再次赋值
正确答案: A C
解析:
1.final修饰的变量等用于常量
2.final修饰方法中的参数,称为最终参数
3.final修饰的类,无法被继承
4.final修饰的方法,无法被重写
final不能修饰抽象类和接口
final修饰的方法可以被重载 但不能被重写
题九
9.以下哪种方式实现的单例是线程安全的
A:枚举
B:静态内部类
C:双检锁模式
D:饿汉式
正确答案:ABCD
解析:
单列模型的6种实现方式:
1.懒汉式(线程不安全)
2.饿汉式(线程安全)
3.双重检查锁实现(线程安全)
4.静态内部类实现(线程安全)
5.枚举类实现(线程安全)
6.(线程安全版)懒汉式
题十
10.下列哪些操作会使线程释放锁资源?
A:sleep()
B:wait()
C:join()
D:yield()
正确答案: B C
解析:
1.sleep会使当前线程睡眠指定时间,不释放锁
2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁
3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁