《零基础学 Java》 FAQ 之 13- 编程里的两个特殊的值

编程里的两个特殊的值
编程里有俩特殊的值,一个是 null,一个是 undefined。我们来聊聊这俩值。
赋值为 null 代表什么?
有同学问给引用赋值为 null 是什么意思,比如
String a = null;
这个也算是计算机和编程里的一个略违和的地方。和从 0 开始计数有的一拼。
要理解这些,可能要接触的知识比第一章的内容略多一点。
从底层来说,a 就是一个地址,指向一个实际的值。比如说,就好像从本子上撕下来一页纸,然后计划用这张纸记录一个房子的地址。那么这张纸就是 a,a 上的内容就是房子的地址,实际的值就是房子。
三个主角:a(纸),房子的地址(a 的内容),房子本身(a 指向的实际的值,也就是后面我们要学到的对象和数组实体)
回到问题本身,a = null 是什么意思呢?a 本身是内存里的以块内存,它本身可能是被使用过的,本身就是有内容的。就好像从本子上撕下一张纸,这张纸之前已经被人用铅笔写上过内容了。
那么问题就尴尬了,我本来撕下这张纸,是用来记录一个房子的地址的。那么这张纸上原本的内容,可能是一首古诗里的几个字。比如“窗前明月”,如果把这四个字当作房子的地址,会出莫名其妙的错误。所以我们在撕下这张纸并打算用它记录房子地址的同时,应该做一个初始化的工作,简单来说就是,把这张纸上原来的内容擦掉。
a = null, 正是这么一个“把这张纸上原来的内容擦掉”的操作。a 被拿来指向一个对象或者数组实体,那么 a 之前无论被用作什么别的目的,都要先清除掉原来的内容。否则就会出问题,拿着 a 原来的值当作对象或者数组的地址,会出内存问题。这也是 Java 比 C 和 C++省心的一个重要的方面。Java 是不允许人为操作内存地址的。
那么擦掉之后,null 代表什么呢?null 代表什么都没有,代表空。就好像撕下一张用过纸,准备记录一个房子的地址,拿过纸来,先用橡皮把值上面的内容擦掉。空空如也的一张纸,就是 null。
理解 undefined
计算机里有两个特殊的值,和具体的编程语言无关。一个叫做 null,0,空,随便叫它什么,它代表的就是无。比如 Java 里的 null。
还有一个叫做 undefined,就是不知道是什么值。可以认为就是这个内存之前被使用过之后的值。这个值在新的用途下没有意义,必须清除掉,否则就会出问题。就好像我们前面说的那个纸,当我们打算拿作它用的时候,之前铅笔在上面写过内容没擦掉之前,这张纸上的内容对我们来说,就是 undefined。它既不是空,也不是一个在新的用途下,合法的值。
这就是 undefined 值代表的意义:既不是空,也不合法。那么怎么办?清除掉呗。拿起橡皮擦干净,它的值就是 null 了。
Java 中不允许 undefined 的情况,每个值在使用前,都是有明确的值的。比如所有的基本类型,都有默认的初始值,引用则为 null。这一点为 Java 避免了大量的潜在的 bug。所以 Java 能够流行起来,是有其原因的,如果和 C/C++比较,Java 太省心了。
说回 Java。我们讲过,对象里的成员变量会赋初始值,但是方法里的局部变量不会,Java 编译器会强制我们在使用前给局部变量赋值,否则就是编译错误。那么为什么 Java 不给局部变量也赋初始值呢?为什么要在 Java 里留下这么一个 undefined 小尾巴呢?
我不知道。
也许是为了小小的,微不足道的性能优化吧。反之记得在局部变量使用前给它赋值就对了。记得在某些别的编程语言里,有一个 undefined 的东西,而 Java 里不允许它的存在。
理解这两种特殊的值的含义,也算是编程的必经之路。
这篇文章来自极客时间推出的《零基础学Java》中的 FAQ。除了在每节视频课下方回答大家的问题之外,针对大家提出的优质问题或者普遍问题,如果需要更大篇幅的文章解答,则会在 FAQ 中以文章的方式给出回答。带你零基础入门,夯实 Java,课程地址:https://time.geekbang.org/course/intro/181
版权声明: 本文为 InfoQ 作者【臧萌】的原创文章。
原文链接:【http://xie.infoq.cn/article/ba6df69a4f198e36a34a77f26】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论