1. 在Java中,main()方法的返回值的类型是:
A public
B static
C void
D String
正确答案:C
2. 以下代码执行的结果显示是多少()?
public class Demo{
public static void main(String[] args){
System.out.print(getNumber(0));
System.out.print(getNumber(1));
System.out.print(getNumber(2));
System.out.print(getNumber(4));
}
public static int getNumber(int num){
try{
int result = 2 / num;
return result;
}catch (Exception exception){
return 0;
}finally{
if(num == 0){
return -1;
}
if(num == 1){
return 1;
}
}
}
}
A 0110
B -1110
C 0211
D -1211
正确答案:B
解析:
1.try块是必须的,catch块和finally块都是可选的,但必须存在一个或都存在。try块不能单独存在。
2.try块里的语句运行中出现异常会跳过try块里其他语句,直接运行catch里的语句。
3.无论try块中是否有异常,无论catch块中的语句是否实现,都会执行finally块里的语句。
4.如果try块或catch块中有return语句,finally块里的语句会执行在try块或catch块中的return语句前。
5.如果finally块里有return语句,则直接返回,而不执行try块或catch块里的return语句。
6.只有一种办法不执行finally块里的语句,那就是调用System.exit(1);方法,即退出java虚拟机。
强调:finally块里的语句在try或catch里的人return前执行!!!
3. 非抽象类实现接口后,必须实现接口中的所有抽象方法,除了abstract外,方法头必须完全一致.
A 正确
B 错误
正确答案:B
解析:
实际上这道题考查的是两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
4. 下面代码输出是?
double d1=-0.5;
System.out.println("Ceil d1="+Math.ceil(d1));
System.out.println("floor d1="+Math.floor(d1));
A Ceil d1=-0.0 floor d1=-1.0
B Ceil d1=0.0 floor d1=-1.0
C Ceil d1=-0.0 floor d1=-0.0
D Ceil d1=0.0 floor d1=0.0
E Ceil d1=0 floor d1=-1
正确答案:A
解析:
A ceil:大于等于 x,并且与它最接近的整数。 floor:小于等于 x,且与 x 最接近的整数。
5. 下列描述错误的是?
A 类只能继承一个父类,但是可以实现多个接口
B 抽象类自身可以定义成员而接口不可以
C 抽象类和接口都不能被实例化(忽略匿名内部类)
D 一个类可以有多个父类和多个基接口
正确答案:BD
解析:
A、java为单继承,多实现。可以实现多个接口。
B、接口允许定义成员,但必须是常量。
C、抽象类和接口类的无法实例化,任何编译器中直接使用new会报错。
D、同A,单继承,多实现
6. 用户不能调用构造方法,只能通过new关键字自动调用。()
A 正确
B 错误
正确答案:B
解析:
选B。 在类内部可以用户可以使用关键字this.构造方法名()调用(参数决定调用的是本类对应的构造方法) 在子类中用户可以通过关键字super.父类构造方法名()调用(参数决定调用的是父类对应的构造方法。) 反射机制对于任意一个类,都能够知道这个类的所有属性和方法,包括类的构造方法。
7. 有以下程序段, 则下面正确的选项是()
public class MyThead extends Thread{
public static void main(String[] args) {
MyThead t=new MyThead();
MyThead s=new MyThead();
t.start();
System.out.println("one.");
s.start();
System.out.println("two.");
}
public void run() {
System.out.println("Thread");
}
}
A 编译失败
B 程序运行可能结果为: one. Thread two. Thread
C 程序运行可能结果是: one. two. Thread Thread
D 程序运行结果不稳定
正确答案:BCD
解析:
这题只需要看"one."和"two."顺序就可以了,因为System.out.println("one.");System.out.println("two.");同在一个线程A(假设命名为A),所以必须顺序输出。新启动的两个子线程(注意重写了run方法)与线程A构成多并发,执行顺序无法预知,所以程序运行结果不稳定。一句话,线程内顺序执行,多线程间并发执行。严格来说,D选项也是不准确的,因为无法保证"one."在"two."前输出。望更正。
8. 下面说法正确的是?()
A 调用Thread的sleep()方法会释放锁,调用wait()方法不释放锁
B 一个线程调用yield方法,可以使具有相同优先级线程获得处理器
C 在Java中,高优先级的可运行的线程会抢占低优先级线程的资源
D java中,线程可以调用yield方法使比自己低优先级的线程运行
正确答案:BC
解析:
sleep()会抱着锁睡觉,wait会把锁释放
yield()让有相同优先级的线程之间能够适当的轮换执行
Java中wait()、sleep()、yield()方法的区别:[译]Java中Wait、Sleep和Yield方法的区别 - 简书
9. 下列说法正确的是()?
A 我们直接调用Thread对象的run方法会报异常,所以我们应该使用start方法来开启一个线程
B 一个进程是一个独立的运行环境,可以被看做一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源
C synchronized可以解决可见性问题,volatile可以解决原子性问题
D ThreadLocal用于创建线程的本地变量,该变量是线程之间不共享的
正确答案:BD
解析:
volatile与synchronized的区别:
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.
10. 下列哪些方法是针对循环优化进行的
A 强度削弱
B 删除归纳变量
C 删除多余运算
D 代码外提
正确答案:ABD
解析:
常见的代码优化技术有:复写传播,删除死代码, 强度削弱,归纳变量删除
如果有同学有研究过这部分内容,并总结过,有更好的答案,请联系我删除本篇非原创解答
复写传播:
- 复写语句:形式为f = g 的赋值
- 优化过程中会大量引入复写
- 复写传播变换的做法是在复写语句f = g后,尽可能用g代表f
- 复写传播变换本身并不是优化,但它给其他优化带来机会
- 常量合并(编译时可完成的计算)
- 死代码删除
死代码删除
- 死代码是指计算的结果决不被引用的语句
- 一些优化变换可能会引起死代码
代码外提
- 代码外提是循环优化的一种
- 循环优化的其它重要技术
- 归纳变量删除
- 强度削弱
例:
while(i <= limit - 2) ... // 代码外提后变成 t = limit - 2; while(i <= t) ...
归纳变量删除
j = j - 1 t4 = 4 * j t5 = a[t4] if t5 > value goto B3
- j和t4的值步伐一致地变化,这样的变量叫作归纳变量
- 在循环中有多个归纳变量时,也许只需要留下一个
- 这个操作由归纳变量删除过程来完成
- 对本例可以先做强度削弱,它给删除归纳变量创造机会
强度削弱
- 强度削弱的本质是把强度大的运算换算成强度小的运算,例如将乘法换成加法运算。