1.以下代码执行的结果显示是多少()?
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 |
解析:
try,catch,finally中:
finally有返回值就一定会在try和catch之前执行,但是如果finally使用了return或者throw语句,将会使trycatch中的return或者throw失效
num=2,try中返回1,执行finally语句,finally语句中没有返回,于是返回try中的1;
num=4,try中返回0,执行finally语句,finally语句中没有返回,于是返回try中的0.
答案: B
2.关于访问权限说法正确 的是 ?
A. 外部类前面可以修饰public,protected和private |
---|
B. 成员内部类前面可以修饰public,protected和private |
C. 局部内部类前面可以修饰public,protected和private |
D. 以上说法都不正确 |
解析:
( 1 )对于外部类而言,它也可以使用访问控制符修饰,但外部类只能有两种访问控制级别: public 和默认。因为外部类没有处于任何类的内部,也就没有其所在类的内部、所在类的子类两个范围,因此 private 和 protected 访问控制符对外部类没有意义。
( 2 )内部类的上一级程序单元是外部类,它具有 4 个作用域:同一个类( private )、同一个包( protected )和任何位置( public )。
( 3 ) 因为局部成员的作用域是所在方法,其他程序单元永远不可能访问另一个方法中的局部变量,所以所有的局部成员都不能使用访问控制修饰符修饰。
答案 :B
3.运行代码,输出的结果是()
public class P {
public static int abc = 123;
static{
System.out.println("P is init");
}
}
public class S extends P {
static{
System.out.println("S is init");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(S.abc);
}
}
A.P is init 123 |
---|
B.S is init P is init 123 |
C.P is init S is init 123 |
D.S is init 123 |
解析:
属于被动引用不会出发子类初始化
1.子类引用父类的静态字毀,只会触发子类的加载、父类的初始化,不会导致子类初始化
2.通过数组定义来粥|用类,不会触发此类的初始化
3.常量在编译阶段会进行常量优化,将常存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
不会初始化子类的几种
1.调用的是父类的static方法或者字段
2.调用的是父类的final方法或者字段
3.通过数组来引用.
正确答案: A
volatile与synchronized的区别:
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量只有当前线程可以访问该变量其他线程被阻塞住
volatile仅能使用在变量级别,synchronized则可以使用在变量方法.
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
volatile标记的变量不会被编译器优化,而synchronized标记的变可以被编译器优化
使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出, 进程就不会终止。主线程就是一个前台线程。 而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。
一 般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一 般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫的程序
synchronized:
A.无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的
对象是一个静态方法或一 个类,则它取得的锁是对类,该类所有的对象同-把锁。
B.每个对象只有-个锁(lock) 欤相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以烬量避免无谓的同步控制。