2019年11月15日 java3

考点1

执行下列代码的输出结果是( )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}
catch(RuntimeException e){
}
catch(Exception e2){
}
finally{
b += 10;
return b;
}
}
}
  • A 10
  • B 20
  • C 30
  • D 40

解析

显示答案/隐藏答案正确答案: C

如果finally块中有return语句的话,它将覆盖掉try或者catch语句中其他return语句。

考点2

给出以下代码,请给出结果.
class Two{
Byte x;
}
class PassO{
public static void main(String[] args){
PassO p=new PassO();
p.start();
}
void start(){
Two t=new Two();
System.out.print(t.x+””);
Two t2=fix(t);
System.out.print(t.x+” “ +t2.x);
}
Two fix(Two tt){
tt.x=42;
return tt;
}
}

  • A null null 42
  • B null 42 42
  • C 0 0 42
  • D 0 42 42
  • E An exception is thrown at runtime
  • F Compilation

解析

显示答案/隐藏答案正确答案: B

成员变量会默认初始化。
Byte是byte的包装类型,初始化为null而不是0

考点3

以下关于对象序列化描述正确的是

  • A 使用FileOutputStream可以将对象进行传输
  • B 使用PrintWriter可以将对象进行传输
  • C 使用transient修饰的变量不会被序列化
  • D 对象序列化的所属类需要实现Serializable接口

解析

显示答案/隐藏答案正确答案: CD

使用ObjectOutputStream和ObjectInputStream可以将对象进行传输.

什么是对象序列化

Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。

使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量
由此可知,
对象序列化不会关注类中的静态变量**。

A、B:使用ObjectInputStream和ObjectoutputStream进行对象的传输
注意:
1.基本数据类型的变量可以直接序列化
2.对象要被序列化,它的类必须实现Serializable接口,如果一个类中有引用类型的变量,这个引用类型的变量的类也必须实现Serializable接口。如果这个引用类型的变量不想被实例化,则用transient修饰(ObjectInputStream)

对象序列化只能保存对象的数据

而static代表类的状态, transient代表对象的临时数据。
所以声明为static和transient类型的成员数据不能被序列化。

考点5

What might cause the current thread to stop or pause executing

  • A An InterruptedException is thrown.
  • B The thread executes a wait() call.
  • C The thread constructs a new Thread.
  • D A thread of higher priority becomes ready.
  • E The thread executes a waitforID()call on a MediaTracker.

解析

显示答案/隐藏答案正确答案: ABE

题目:什么操作会使得当前线程停止。
A:一个InterruptedException 异常被捕获 大家都知道的嘛 (一般通过interrupt方法 中断线程) 如果抓到一个线程 都会关紧catch里面 然后中断当前操作,A正确。
B:线程执行了wait()方法。 线程使用了wait方法,会强行打断当前操作,(暂停状态,不会中断线程) 进入阻塞(暂停)状态,然后需要notify方法或notifyAll方法才能进入就绪状态。 B 正确。
C:当前线程创建了一个新的线程。 新创建的线程不会抢占时间片,只有等当前线程把时间片用完,其他线程才有资格拿到时间片去执行。
D:一个高优先级别的线程就绪。 如C相同,你优先级别再高 也待等我现在弄完才会给你。(就像我们玩游戏,会员虽然有排队优先权,但是还是要等正在登陆的用户进去游戏之后才能抢到他原来那个位置,不能说我在过关卡的过程中你一脚把我踢开,然后霸占我的位置吧,我原来的那些数据咋办!!!)
E:线程在MediaTracker上执行了waitforID()调用。
这个应该大家也不太熟悉。这个类是awt里面的,我查API才知道。
然后他的功能是加载图像,直到完成之前,该方法一直等待!这个方法是必须要抛出A选项的InterruptedException 异常的 说明这玩意会让其他线程 wait他完成! 所以会暂停当前线程

考点6

下面哪些描述是正确的:( )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Test {
public static class A {
private B ref;
public void setB(B b) {
ref = b;
}
}
public static Class B {
private A ref;
public void setA(A a) {
ref = a;
}
}
public static void main(String args[]) {
…start();
….
}
public static void start() {
A a = new A();
B b = new B();
a.setB(b);
b = null;
//a = null;

}
}
  • A b = null执行后b可以被垃圾回收
  • B a = null执行后b可以被垃圾回收
  • C a = null执行后a可以被垃圾回收
  • D a,b必须在整个程序结束后才能被垃圾回收
  • E 类A和类B在设计上有循环引用,会导致内存泄露
  • F a, b 必须在start方法执行完毕才能被垃圾回收

解析

显示答案/隐藏答案正确答案: BC

内存如下:
a -> “a(b)”
b -> “b”
a引用指向一块空间,这块空间里面包含着b对象
b引用指向一块空间,这块空间是b对象
A选项,b = null执行后b可以被垃圾回收。这里”b可以被垃圾回收”中的b指的是引用b指向的内存。这块内存即使不被引用b指向,还是被引用a指向着,不会被回收。
B选项,a = null执行后b可以被垃圾回收。从代码中可以看到,a = null是在b = null后执行的,该行执行后,引用a和b都没有指向对象,对象会被回收。

考点7

对 Map 的用法,正确的有:

  • A new java.util.Map().put("key" , "value") ;
  • B new java.util.SortedMap().put("key" , "value") ;
  • C new java.util.HashMap().put( null , null ) ;
  • D new java.util.TreeMap().put( 0 , null ) ;

解析

显示答案/隐藏答案正确答案: CD

接口不能new

A选项Map属于接口类型,不可以new的方式创建对象。所以A错误。
B选项SortedMap属于接口类型,不可以new的方式创建对象。所以B错误。

TreeMap的key不能为null

C选项HashMap基于哈希表实现Map接口的类,并允许null的值和null键。
D选项TreeMap通过红黑树实现Map接口的类,key不可以为null,会报NullPointerException异常,value可以为null。