错题--分析--理论知识@3

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.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以烬量避免无谓的同步控制。


三元操作符如果遇到可以转换为数字的类型,会做自动类型提升。
比如
Object o1 = (false) ? new Double(1.0) : new Integer(2);
System.out.println(o1);
会打印2.0

byte类型的变量在做运算时被会转换为int类型的值,故A、B左为byte,右为int,会报错;而a+=b语句会将被赋值的变量自动强制转化为相对应的类型。
x%y
当x和y的正负不同时,取余结果的符号和x相同

final会保持该类型不自动向上转型。
byte b=1, c=2;
byte b = (a+c);不会报错

Java在序列化时不会实例化static变量和transient修饰的变量,因为static代表类的成员,transient代表对象的临时数据,被声明这两种类型的数据成员不能被序列化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值