Java五道输出易错题解析

文章探讨了Unicode规范中的文件编码字符、Java中自动装箱拆箱的过程、类静态成员的初始化顺序,以及如何避免自以为是的异常情况。同时提到了变长参数在简化代码中的作用,并以Mybatis源码解析为例,强调了程序员提升知识深度和广度的重要性。
摘要由CSDN通过智能技术生成

Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZEROWIDTHNO-BREAKSPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。因此下面的语句会输出65279,刚好是FEFF


System.out.println((int)"2".charAt(0));

2. 类静态成员初始化

下面的程序能编译通过么?如果通过,说结果并解释,不能编译,说错误原因。


class A

{

    public static int X;

    static { X = B.Y + 1;}

}

public class B

{

    public static int Y = A.X + 1;

    static {}

    public static void main(String[] args) {

        System.out.println("X = "+A.X+", Y = "+B.Y);

    }

}

解析:这个程序能正确运行,类的运行过程如下:

首先加载主类B,初始化静态成员Y,发现需要类A的信息,于是加载类A,初始化静态成员X,也用到B类信息,由于此时B类的Y还未成功加载因此这里是默认值0,从而得到A类的X为1,然后返回到B类,得到Y为2。

3. 装箱拆箱的实际过程

关于自动装箱,相信大部分人都明白是怎么一回事,但真的完全明白了嘛?

先看下面的代码:


Short s1 = 1;

Short s2 = s1;

System.out.println(s1 == s2);

谁都知道当然打印true了。现在加一句试试:


Short s1 = 1;

Short s2 = s1;

s1++;

System.out.println(s1 == s2);

还是true吗?No,这次输出成了false。WHY?难道s1和s2引用的不是同一个对象吗?有这些疑问的说明你对自动装箱拆箱的过程还不是非常清楚,实际上上面的代码可以翻译为下面的代码(实际执行过程,要掌握):


Short s1 = new Short((short)1);

Short s2 = s1;

short tempS1 = s1.shortValue();

tempS1++;

s1 = new Short(tempS1);

System.out.println(s1 == s2);

哦,原来如此,这下明白了,因此我们在使用自动装箱的时候小心点为妙。

4. 你自以为是的异常

先来两句代码:


NullTest myNullTest = null;

System.out.println(myNullTest.getInt());

相信很多人看到这段代码时,都会自以为是的说:NullPointerException。果真如此吗?你还没看到NullTest 这个类是如何定义的呢。现在看看这个类的定义:


class NullTest {

     public static int getInt() {

         return 1;

     }

}

由于getInt()是静态方法,他只和类相关,和具体的对象无关,类完成加载时,即可通过**类名.getInt()**进行调用,因此这里就算对象实例为NULL也会正常输出1.

**记住:**类变量和类方法的使用,仅仅依赖引用的类型。即使引用为null,仍然可以调用。从良好实践的角度来看,明智的做法是使用NullTest.getInt()来代替myNullTest.getInt(),但谁不不能保证不会碰到这样的代码,因此还是小心为妙。

5. 变长参数和数组,如何变通?

变长参数特性带来了一个强大的概念,可以帮助开发者简化代码。不过变长参数的背后是什么呢?Basically,就是一个数组。


public void calc(int... myInts) {} 

calc(1, 2, 3);



# 总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

# Mybatis源码解析



![](https://img-blog.csdnimg.cn/img_convert/7b397589bba56351ae13a7ebe098f4dc.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/f73da628aa4ffdc53449154d673c878b.webp?x-oss-process=image/format,png)

实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

# Mybatis源码解析



[外链图片转存中...(img-xwAywwxm-1714339580361)]

[外链图片转存中...(img-IP1NJ22z-1714339580362)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值