== 的两端 对待null, 你怎么看?

经常听到这样一句话,任何类型与null相比较都应该为flase或 任何对象与null比较陡应该为false。我也经常听到这样的话,有时间自己坐下来没事的时候想想,我不是经常用

if (obj != null)
{
...
}
else
{
...
}


这样的语句吗? 难道是我都做了没必要的功,当然不是了,大家都是这样做的啊!!

哦! 这可能是java编程的一些建议而已吧!
那不如为就看看做些实例看看null 在 == 的两端的待遇是如何的吧 :P


...
Object oA = null;
Object oB = null;

System.out.println(oA == null);
System.out.println(oB == null);
System.out.println(oA == oB);
...


经验告诉我前两句的输出肯定是[color=red]TRUE[/color], 最后一个就拿不准了。
打印出来的结果三个 都为 [color=red]TRUE[/color], 想想跟文章最先说的一句话有心理上的矛盾,因为很多文章讲到关于[color=red]equals[/color]的重写实现的话都 [color=red]return false[/color], 那要是两个都为null的对象做比较呢?

又实验了一下:

...
Object oA = null;
Object oB = null;

System.out.println(oA == oB);
System.out.println(oA.equals(oB));
...


想着应该有着喜剧性的结果等待着过吧。 :lol:

运行一下:
:twisted: 哎呀!java.lang.NullPointerException
伤心!! 说来也是 一个null引用怎么能调用方法呢?

看来自己的这个实验比较失败,但是也算学点东西了。
那继续想自己的正题吧, 到底 == 两端 null还有那些待遇呢?

下面继续写测试代码:

Object oA = null;
String sA = null;
Integer IA = null;

System.out.println(sA == oA);
System.out.println(oA == IA);
System.out.println(sA == IA);


猜猜他们的结果: 前两个为 true 最后一个编译没有通过。
看来java对类型的比较严格的防错判断。
不过在这个例子中还是可以发现父子类型(Integer, String 类型都是 Object 的子类型)是可以用==连接的。如果这个例子可能是有Object(因为Object在java程序员心目中一直都很特殊 :) )存在的特殊原因的话,不如再做一个通用一些的例子吧。

...
TestSuper tsp = null;
TestSub tsb = null;
...
System.out.println(tsp == tsb);
System.out.println(tsb == tsp);
...
class TestSuper
{
}

class TestSub extends TestSuper
{
}


这段代码的两个输出同样也都为true。


那么现在还有一个问题, 任何对象都可以null引用, 那null是不是对象并且属于Object类型的呢?

...
System.out.println(null instanceof Object);
System.out.println(null == null);
...


上面的结果我们可以发现第一个的结果为false, 第二个的结果为true。
这样我们就可以知道了: 如果我们把null也看成是引用类型的话,但是它没有继承于Object,而且它也没有引用类型的实例化等特性。那么我们就可以看出null是一种单独的类型,即null type 。那么java中有的不仅仅是 引用类型 和 基本类型了 还有一个null type。

最后一个的结果为true, 告诉我们null也是同样符合 == 的操作的, 虽然看样子其他的类型在 == 两端都很排斥它。
null不能跟基本类型进行比较的,这样我们都知道了,就不再做例子了。

关于 null 在 == 的两端, 我暂时知道了这么多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值