写点什么

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

用户头像
臧萌
关注
发布于: 2020 年 05 月 26 日
《零基础学 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



发布于: 2020 年 05 月 26 日阅读数: 107
用户头像

臧萌

关注

一线程序员,偶尔写写字 2017.10.20 加入

《零基础学 Java》,《职场求生攻略》 视频课作者 《Java入门1·2·3》作者

评论

发布
暂无评论
《零基础学 Java》 FAQ 之 13-编程里的两个特殊的值