冲刺秋招之牛客刷Java记录第二天

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

第一题 下列代码输入什么?
  1. public class Test {
  2.     public static Test t1 = new Test();
  3.     {
  4.         System.out.println("blockA");
  5.     }
  6.     static {
  7.         System.out.println("blockB");
  8.     }
  9.     public static void main(String[] args) {
  10.         Test t2 = new Test();
  11.     }
  12. }
复制代码
解析:
本题考察类加载。
根据跟踪源代码可知,执行main方法之前,Test类就已经加载完毕,也就是说,执行到Test t2 = new Test();的时候,控制台已经打印了blockAblockB。

可以在第4,7,11,15行都打上断点,可以看到程序一开始是从第4行开始执行的。这就说明Test类的加载先于main方法。
创建t2时,再去Test类中执行一次非静态代码块和构造方法,因为没有自定义构造方法,所以只输出非静态代码块的内容。
如果有自定义构造方法,那么先执行非静态代码块,然后执行构造方法。为什么?因为构造方法可能会用到代码块里的东西。把构造方法比喻成吃饭,那么非静态代码块就是把饭菜端到桌子上或者盛到碗里。
而静态域和静态代码块的优先级就更高了,他俩相当于把饭做好。他俩之间的优先级是:谁先被定义,谁就先被执行。在这道题目中,t1的优先级就比静态代码块高。大家可以把他俩的位置换一下,输出的内容一定是
blockB
blockA
blockA

静态域和静态代码块只会执行一次(类加载时)。
非静态域和非静态代码块每次创建对象时都会被执行。
答案:
blockA
blockB
blockA
第二题 下列代码输出什么?
  1. public class Test2 {
  2.     public static void main(String[] args) {
  3.         test();
  4.     }
  5.     public static void add(Byte b) {
  6.         b = b++;
  7.     }
  8.     public static void test() {
  9.         Byte a = 127;
  10.         Byte b = 127;
  11.         add(++a);
  12.         System.out.print(a + " ");
  13.         add(b);
  14.         System.out.print(b + "");
  15.     }
  16. }
复制代码
解析:
add(++a):先把a转成byte,然后用a的补码+1,因为byte类型范围是:[-128,127],所以加1后,a=-128。再将a转为Byte类型,此时才开始调用add(-128),执行过程是这样的:

由图可知,执行b++之后,add方法中的b会指向其他对象,那么,红线就会断开。所以,add方法不会对main中的变量产生影响。所以a=-128,b=127。
答案:
-128 127

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表