那天晚上在机房敲代码,被人突然问起java支持的数据类型有哪些,脑子一下子卡的死死的,明明前一天还看过,张口却说不全,只能翻着摊在键盘边上的笔记一点点捋,越捋心里越乱,总觉得哪里混在了一块。
屏幕上还留着下午写的一段测试代码,本来是随便写来跑变量的,这会刚好拿来试。先敲了几个整型的变量,int、long,写完long的时候忘了后面要加L,直接运行,控制台直接抛出报错,红色的文字铺满一小片,盯着报错信息愣了好久,当时还在想是不是自己记混了类型归属,是不是long不算基础类型里的。
旁边坐的同学瞥了一眼屏幕,随口说了一句,分两大类啊,基本和引用。听见这话的时候,心里稍微稳了一点,但又立刻冒出别的疑问,布尔类型到底放哪边,char又该怎么算,之前看书的时候,总把字符和字符串当成一回事,好几次写代码直接拿String去和char做对比,编译直接过不去。
字符串不一样的。
翻笔记的时候,笔尖在纸面上划来划去,在八个基础类型下面慢慢划线,boolean、byte、short、int、long、float、double、char,写一遍,遮住再默写一遍,连着错两次,总是漏掉byte,或者把float后面的F标记忘掉。写float的时候不加后缀,编译器会默认当成double处理,那一行代码就标黄警告,警告看多了,心里就变得烦躁,明明只是很小的细节,可每次写都容易忘。
引用类型这边就更绕了,当时只记住类、接口、数组,还有字符串,别的就说不上来了。之前一直误以为String是基础类型,这个误区卡了我好一阵子,写作业的时候还在注释里面写过这句话,后来被老师圈出来指出来,才慢慢扭转过来这个想法,只是隔上两三天不碰,脑子里又会隐隐冒出那个错误的念头,要刻意回想一遍才能分清。
试着单独写了一个数组的变量,数组本身属于引用类型,就算里面存的是int值,数组这个本体也不归基础类型,这点理解起来花了不少功夫。跑代码的时候打印两个数组变量,输出出来的是一串地址,不是里面存的数字,盯着那串地址看了很久,才慢慢意识到,引用类型存的不是值本身,是指向内存的地址,和基础类型直接存放数值的方式完全两样。
中间停下来喝了一口水,看着屏幕上乱七八糟的测试行,一会删了重写,一会注释掉一部分。试过声明boolean变量,它只有true和false两个取值,不能拿数字去替代,之前在别的语言里习惯用0和1代表真假,换到java里面直接写,代码根本跑不通,改了两次才改对。char能存单个字符,也可以存转义字符,写换行符的时候,总是忘记反斜杠要写对,少写一个,或者写成正向的斜杠,又是一堆报错。
还有取值范围的问题,笔记上记了每个整型能容纳的大小,但是记的很松散,byte范围最小,long要加上大写L,float是F,double可以不加后缀,默认的小数就是double类型,这些细碎的小点堆在一起,很容易互相串味。那天晚上没有整理成整齐的清单,只是顺着写代码的过程一点点验证,写一个类型,跑一次,看报错,再改,没有去背那种规整的条目。
后来机房里人慢慢变少,周围敲键盘的声音越来越稀疏,代码文件里堆了一大堆没用的测试变量,有的注释掉了,有的直接留在那里。也没有把所有相关的内容全部测完,泛型、包装类那些当时只是扫了一眼,没有深挖,包装类和基础类型之间的自动装箱拆箱,那个时候还只是听说,没有亲手写例子去感受,只知道它们是配套的东西,不属于原始的数据类型分类。
关掉编辑器的时候,没有觉得自己彻底吃透了,只是勉强能分得清两大块,不会再张口就把String归到基础里面。合上笔记本,把笔夹在书页中间,起身的时候腿有点发麻,脑子里还在来回过那八个基础类型,怕下一次被问到,又会卡壳说不全。