Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

1.if条件判断

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

结果 分析:

if条件判断中,flag = true先是一个赋值语句,赋值完成后,flag成为逻辑判断条件,会自动拆箱。

2 .自增运算符

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

3 .自动拆箱装箱问题

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

结果分析:

在基本数据类型和包装类的比较中,Java会自动进行拆箱装箱工作。

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

结果分析:

对于==来说:

如果运算符两边有一方是基本类型,一方是包装类型,在进行==逻辑判断时,包装类型会自动进行拆箱操作,因此i==j返回true;

如果都是包装类型,那么==就是按照正常判断逻辑来,==比较的是对象的地址,但是下面这种情况除外:

    在-128至127这个区间,如果创建Integer对象的时候(1)Integer i = 1; (2) Integer i = Integer.valueOf(1); 如果是这两种情况创建出来的对象,那么其实只会创建一个对象,这些对象已经缓存在一个叫做IntegerCache里面了,所以==比较是相等的。如果不在-128至127这个区间,不管是通过什么方式创建出来的对象,==永远是false,也就是说他们的地址永远不会相等。

举例测试如下:

         Integer i1 = 8; 

         Integer i2 = 8; 

         Integer i3 = 300; //超过了127这个范围

         Integer i4 = 300; 

         Integer i5 = Integer.valueOf(8);

         Integer i6 = new Integer(8);

//         System.out.println(i1 == i2);//true, 在-128至127这个区间,Integer i = 1;和Integer i = Integer.valueOf(1); 这两种方式创建的对象相同

//         System.out.println(i3 == i4);//false ,超过这个区间,创建出的是不同对象

//         System.out.println(i1 == i5);//true , 在-128至127这个区间,Integer i = 1;和Integer i = Integer.valueOf(1); 这两种方式创建的对象相同

         System.out.println(i1 == i6);//false ,在指定区间,只有上面两种方式创建出的对象才相同,通过new出来的是不相同的

 

对于equals来说:

equals不同的对象由不同的实现,对于Integer来说,equals比较的是值。因此,j.equals(i);返回的是true。

4 .类型转换问题

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

结果分析:

被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了

而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。

Java中的byte,short,char进行计算时都会提升为int类型。

5.finally执行在return前还是return后

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

Java笔试题——if条件判断、自增运算符、自动拆箱装箱、类型转换、finally执行顺序

结果 分析:

finally语句是在try(或catch)的return语句执行之后,return返回之前执行。过程如下:在try中如果有return语句,他会首先检测是否有fianlly,如果有的话,就保存try中return要返回的值,然后执行finally中的方法,如果fianlly没有返回值,则finally方法执行完毕之后,返回执行try中的return方法,他会取出之前保存的return值,进行返回。

finally是在try中执行完return后再执行的。只有当finally中也有return的时候,方法将直接返回,不再执行任何代码。 

参考:

https://blog.****.net/shakespeare001/article/details/51669476