经常听到这样一句话,任何类型与null相比较都应该为flase或 任何对象与null比较陡应该为false。我也经常听到这样的话,有时间自己坐下来没事的时候想想,我不是经常用
这样的语句吗? 难道是我都做了没必要的功,当然不是了,大家都是这样做的啊!!
哦! 这可能是java编程的一些建议而已吧!
那不如为就看看做些实例看看null 在 == 的两端的待遇是如何的吧 :P
经验告诉我前两句的输出肯定是[color=red]TRUE[/color], 最后一个就拿不准了。
打印出来的结果三个 都为 [color=red]TRUE[/color], 想想跟文章最先说的一句话有心理上的矛盾,因为很多文章讲到关于[color=red]equals[/color]的重写实现的话都 [color=red]return false[/color], 那要是两个都为null的对象做比较呢?
又实验了一下:
想着应该有着喜剧性的结果等待着过吧。 :lol:
运行一下:
:twisted: 哎呀!java.lang.NullPointerException
伤心!! 说来也是 一个null引用怎么能调用方法呢?
看来自己的这个实验比较失败,但是也算学点东西了。
那继续想自己的正题吧, 到底 == 两端 null还有那些待遇呢?
下面继续写测试代码:
猜猜他们的结果: 前两个为 true 最后一个编译没有通过。
看来java对类型的比较严格的防错判断。
不过在这个例子中还是可以发现父子类型(Integer, String 类型都是 Object 的子类型)是可以用==连接的。如果这个例子可能是有Object(因为Object在java程序员心目中一直都很特殊 :) )存在的特殊原因的话,不如再做一个通用一些的例子吧。
这段代码的两个输出同样也都为true。
那么现在还有一个问题, 任何对象都可以null引用, 那null是不是对象并且属于Object类型的呢?
上面的结果我们可以发现第一个的结果为false, 第二个的结果为true。
这样我们就可以知道了: 如果我们把null也看成是引用类型的话,但是它没有继承于Object,而且它也没有引用类型的实例化等特性。那么我们就可以看出null是一种单独的类型,即null type 。那么java中有的不仅仅是 引用类型 和 基本类型了 还有一个null type。
最后一个的结果为true, 告诉我们null也是同样符合 == 的操作的, 虽然看样子其他的类型在 == 两端都很排斥它。
null不能跟基本类型进行比较的,这样我们都知道了,就不再做例子了。
关于 null 在 == 的两端, 我暂时知道了这么多。
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 在 == 的两端, 我暂时知道了这么多。