`
xfei6868
  • 浏览: 69790 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
   经常听到这样一句话,任何类型与null相比较都应该为flase或 任何对象与null比较陡应该为false。我也经常听到这样的话,有时间自己坐下来没事的时候想想,我不是经常用
if (obj != null)
{
    ...
}
else
{
    ...
}


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

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

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

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


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

又实验了一下:
...
Object oA = null;
Object oB = null;

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


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

运行一下:
哎呀!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 在 == 的两端, 我暂时知道了这么多。
0
1
分享到:
评论
3 楼 RednaxelaFX 2009-05-24  
xfei6868 写道
是啊 是要读一些标准著作啊!但是有时候感觉看这些东西好像很没意思,而且一时也不能看懂。所以有时候就只能用实践的方式来验证一些自己的想法了。

觉得实践的方式可以跟确认离的近一些 所以现在还是这个阶段。
读那些java标准之类的东西更是头痛

呵呵 况且英文读着就更不舒服了

啊,如果阅读英文觉得不顺的话那是比较烦。一开始坚持一下,撑过开头一段时间读资料就会顺很多。
用“实践”的方式去确认特性很多时候比较盲目,因为得到的信息过于片面所以不保证能准确的能从“表面结果”推到“实际特性”。我觉得如果对什么地方有疑问的话,结合规范与实践才比较靠谱。规范这种东西不用像学课本那样去读,可以分阶段选择性的通过阅读规范来加深自己的认识。
2 楼 xfei6868 2009-05-24  
RednaxelaFX 写道

要确认语言中的概念一个很直接的办法就是阅读语言规范。


是啊  是要读一些标准著作啊!但是有时候感觉看这些东西好像很没意思,而且一时也不能看懂。所以有时候就只能用实践的方式来验证一些自己的想法了。

觉得实践的方式可以跟确认离的近一些 所以现在还是这个阶段。
读那些java标准之类的东西更是头痛

呵呵 况且英文读着就更不舒服了 
1 楼 RednaxelaFX 2009-05-24  
要确认语言中的概念一个很直接的办法就是阅读语言规范。在Java语言规范第三版里,
Java Language Specification, 3rd Edition 写道
4.1 The Kinds of Types and Values

There are two kinds of types in the Java programming language: primitive types (§4.2) and reference types (§4.3). There are, correspondingly, two kinds of data values that can be stored in variables, passed as arguments, returned by methods, and operated on: primitive values (§4.2) and reference values (§4.3).
Type:
    PrimitiveType
    ReferenceType

There is also a special null type, the type of the expression null, which has no name. Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type. The null reference is the only possible value of an expression of null type. The null reference can always be cast to any reference type. In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.

null是null type的唯一值;null type是个特殊类型,没有名字,所以无法声明null type的变量或者强制转换到null type;null type不等于任何引用类型,但null可以转换到任意引用类型。

相关推荐

Global site tag (gtag.js) - Google Analytics