PDF 课件和源代码下载地址:
https://github.com/geektime-geekbang/LetsJava
作者回复: 明确一下问题,你是对
String a = null;
有疑问。
这个也算是计算机和编程里的一个略违和的地方。和从0开始计数有的一拼。
FAQ版本在此:https://github.com/deepnighttwo/LetsJava/blob/master/FAQ/02%E7%AB%A0-%E7%BC%96%E7%A8%8B%E9%87%8C%E7%9A%84%E4%B8%A4%E4%B8%AA%E7%89%B9%E6%AE%8A%E7%9A%84%E5%80%BC.md
要理解这些,可能要接触的知识比第一章的内容略多一点。
从底层来说,a就是一个地址,指向一个实际的值。比如说,就好像从本子上撕下来一页纸,然后计划用这张纸记录一个房子的地址。那么这张纸就是a,a上的内容就是房子的地址,实际的值就是房子。
三个主角:a(纸),房子的地址(a的内容),房子本身(a指向的实际的值,也就是后面我们要学到的对象和数组实体)
回到问题本身,a = null是什么意思呢?a本身是内存里的以块内存,它本身可能是被使用过的,本身就是有内容的。就好像从本子上撕下一张纸,这张纸之前已经被人用铅笔写上过内容了。
那么问题就尴尬了,我本来撕下这张纸,是用来记录一个房子的地址的。那么这张纸上原本的内容,可能是一首古诗里的几个字。比如“窗前明月”,如果把这四个字当作房子的地址,会出莫名其妙的错误。所以我们在撕下这张纸并打算用它记录房子地址的同时,应该做一个初始化的工作,简单来说就是,把这张纸上原来的内容擦掉。
a = null, 正是这么一个“把这张纸上原来的内容擦掉”的操作。a被拿来指向一个对象或者数组实体,那么a之前无论被用作什么别的目的,都要先清除掉原来的内容。否则就会出问题,拿着a原来的值当作对象或者数组的地址,会出内存问题。这也是Java比C和C++省心的一个重要的方面。Java是不允许人为操作内存地址的。
计算机里有两种特殊的值,和具体的编程语言无关。一种叫做null,0,空,随便叫它什么,它代表的就是无。比如Java里的null。
还有一种叫做undefined,就是不知道是什么值。可以认为就是这个内存之前被使用过之后的值。这个值在新的用途下没有意义,必须清除掉,否则就会出问题。
理解这两种特殊的值的含义,也算是编程的必经之路。
作者回复: 8错8错
作者回复:
欧耶!欧耶!!
作者回复: 单纯的代码块确实是鸡肋。很多人可能都不知道有这个语法。在这里列出来,其实是帮助大家统一对代码块的认识。其实代码块无处不在,跟在 if-else,while,for,还有后面要讲到的方法 后面。它就是来限定作用域的。单纯没有名字的使用代码块的地方确实不多。
嵌套多了,逻辑复杂了,代码块的作用就更凸显了。
作者回复: 这是一个更好的实现,手动点赞👍
作者回复: 请叫我大啰嗦
哈哈,第二篇的内容已经注意了,一节课只专注于一个点。成品内容应该会控制在10分钟以内。
作者回复: 所以你的问题是?
作者回复: 被你发现了,其实后面我会说到。这是intelliJ的format代码功能。在菜单栏 code 下面有 reformat code菜单项,就是这个功能。菜单项上有快捷键,不用每次点菜单,用起来贼爽。