PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 如果是之前没有编程经验的同学,我是认真的。 编程要培养感觉,看懂学会不等于会用,抄十遍和锻炼身体一样,有一定的重复,才能形成本能。而且,在抄的时候,要一边写一边想为什么。这才是目的。目的是抄几遍之后,自己能够想着写出来,更进一步,可以对其中的代码进行改善。这才是消化吸收的过程。
作者回复: 1)从Java 5开始,Java支持了自动装箱和拆箱(auto boxing, auto unboxing)。意思就是在需要的时候,会把基础类型(boolon,int等)和其对应的封装类型(Boolean,Integer等)自动转换。基础类型是没有任何方法的,就是一个纯粹的数据。不确定你是怎么做信号量的,如果只是使用一个布尔的值,那么这两种是没有区别的,如果要用到一些方法,比如wait之类的,那么其实是使用的Boolean类型的。 2)null是引用的缺省值,不是类型。就好像int的缺省值是0,boolean的缺省值是false。引用可以认为是一种存储对象地址的基础类型,它的缺省值就是null(落到实际内存的存储上,其实就是0,但是因为没有任何一个对象的地址会是0,所以引用对应的内存的值如果是0,那么Java就知道,这个引用其实是空,也就是不指向任何对象)。所有的引用都可以用null赋值,包括你上面提到的String的引用。
作者回复: 嗯呐。边界可以特殊处理一下。我记得可以给rangeEnd加1
作者回复: int bigRandom = (int)(Math.random() * rangeEnd * 100); //首先,Math.random()是一个从0到1的数字,所以,肯定要乘以一个大点的整数,才能保证随机性。比如说,如果rangeEnd是60,Math.random()是0.001,那么结果就是0.6了,强转整数就是0了。这个程序这么看可能更好理解:(int)(Math.random() * 100 * rangeEnd),那么Math.random() * 100就是一个从0到100的随机数,再乘以rangeEnd,那么就是一个从0到rangeEnd*100的随机数了。 int unmberToGuess = (bigRandom % mod) + rangeStart; //理解了上面的,下面就好理解了,rangeStart是保证了最小数,bigRandom % mod是让这个从0到rangeEnd*100的随机数变成一个从0到mod的随机数,也就是从0到rangeEnd - rangeStart,两者加在一起就是一个从rangeStart到rangeEnd 的随机数了。 当然这不是唯一的方法,这几行code就是要做到两点: 1:得到一个从rangeStart到rangeEnd的整数 2:这个数足够随机 你可以试着想想别的方法
作者回复: 不一样的,if只会执行一次,你改了代码跑一下立刻就知道区别了
作者回复: https://github.com/geektime-geekbang/LetsJava,可以download as zip。
作者回复: 猜对了就重回五次机会了
作者回复: 嗯呐,支持对同一个数字,可以猜多次
作者回复: Java中的内存分配在FAQ里有说到一些。总的来说,Java的内存分配比起go等语言来说是简单很多的。除非你搞JVM优化开发,一般来说,内存分配就两种: 1)方法的局部变量和方法的参数是在栈上分配的,其中包括所有基本数据类型和引用类型的数据。这些数据无法共享,只能当前方法执行的时候使用。 2)所有new 出来的对象都是在堆上分配的。这些数据可以在不同的线程/方法里共享。 那么有个问题来了,在一个方法里new一个对象,然后当作参数传递给第二个方法,这算是什么呢?这算是引用的赋值,引用就是引用,只是一个记录了对象地址的纸条,所以,传递的是引用(不共享,是通过重新申请内存,复制源引用的值),共享的是对象。 前面说到的FAQ在这里: https://xie.infoq.cn/article/38f5ad03242b79b46e30bfa1b
作者回复: 当时谈论的是变量的创建。你在代码块里面创建一个变量,比如叫a,出了代码块,还可以再创建变量a,不会认为是重名。 你这里说的是访问,内部的代码块可以访问外部代码块的变量。