【Java编程思想读书笔记】第二、三、四章
一切都是对象&操作符&控制执行流程
参考书目:《Java编程思想》(第四版)
阅读《Java编程思想》(第四版)一书收获颇多,之所以想通过用博客记笔记的方式来读书,是因为这样可以倒逼自己仔细、反复地阅读书中的知识,找相对意义上的重点,并且由于人脑更适合输出型的学习,通过将内容边看、边记、边理解和边打字写文,相比直接反复阅读更有效益(当然这本书后续仍需反复阅读几十遍甚至百遍以上都不为过),而另一个原因就是这样也能够在阅读中通过博客来记录自己的学习历程,博客记录的不只是图文,它们记录的正是自己的成长,等以后毕业或者工作后,回首大学四年,多少有点可以回念的东西,还可以说一句:一路走来,我读了很多前辈们的好书,对技术充满了热情,永远在不断学习的路上。
start.作者讲授思路:
1.五个不同的地方可以存储数据:
- 寄存器:这是最快的存储区,它位于处理器内部,其数量及其有限,根据需求进行分配,你不能直接控制,也无法感知其存在(但C和C++运行向编译器建议寄存器的分配方式)。
- 堆栈:位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针向下移动,则分配新的内存,若向上移动,则释放内存。这是一种快速有效的分配存储方法,仅次于寄存器。Java系统必须知道存储在堆栈内所有项的生命周期(限制了灵活性),以便上下移动堆栈指针,Java对象的引用便存储于堆栈中。
- 堆:是一种内存池(也位于RAM区),用于存放所有的Java对象,编译器不需要知道存储的数据在堆里的存活时间(体现了灵活性),new一个对象时,会自动在堆里进行存储分配,用堆进行存储分配和清理会比用堆栈花更多时间。
- 常量存储:常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
- 非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。如流对象和持久化对象,在流对象中,对象转化成字节流,在持久化对象中,对象被存放于磁盘上,程序终止后,它们仍可以保持自己的状态。
2.对于一些基本类型,特别是小的、简单的变量,Java采用和C、C++相同的方法,不用new来创建变量,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于堆栈中,因此更加高效。但这些基本类型通常也具有相应的包装器类,并可以反向转换(将包装器类的数据转为简单变量存储)。
3.高精度计算类BigInteger支持任意精度的整数,BigDecimal支持任意精度的定点数。它们以牺牲运算速度为代价,换取了精度。
4.Java对象不具备和基本类型一样的声明周期,当用new创建一个Java对象时,它可以存活于作用域之外:
{
String s = new String("a string");
}
引用s在作用域终点就消失了,然而s指向的String对象实体却仍继续占据内存空间,但我们无法在这个作用域之后访问这个对象,因为对它唯一的引用已经超出了作用域的范围。当Java的垃圾回收器监测到这些不会再被引用的对象时,就会释放这些对象的内存空间,以便供其他新的对象使用。
5.调用方法的行为通常被称为:发送消息给对象。
int x = a.f();
消息是f(),对象是a。
6.Java中为什么没有sizeof()?
在C和C++中,需要使用sizeof()的最大原因是为了“移植”,不同数据类型在不同机器上可能有不同的大小;Java由于建设于JRE之上,所有在所有机器上数据类型的大小都相同,无需用sizeof()。
7.移位操作符:
(1)左移位操作符(<<):按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)—[高位舍弃,低位补0]
(2)“有符号”右移操作符(>>):按照操作符右侧指定的位数将操作符左边的操作数向右移动(符号为正:在高位插入0; 为负:在高位插入1)
(3)“无符号”右移操作符(>>>):…在高位插入0
注:
移位+等号,指定移动的位数,例如:k >>>= 10
5 << 2:00000101 —> 00010100 由5变为20
>>:扩大2^k
<<:缩小2^k
end.结语
关于各种概念,剩余部分知识点,有些已与之前的读书笔记书目内容有所交织,因此不再再次整理