《Thinking in java》这本书一直以来都有Java圣经的称号,可以看出这边书在Java工作者当中的心目中的地位,阅读之后必要有笔记,不然随着时间的流逝,一定会忘得一干二净。
开始分章节进行学习,实在是怕内容太多打击自己信息。
下面是第二章的笔记,第一章的笔记后面补吧,没有记已经忘得差不多了,回头重读一遍。
第二章的主要内容只有一个-一切皆对象。
一切皆对象
什么是一切皆对象,一个Java程序是由各个对象组成的,对象是Java程序的基本组成部分。
万事万物都可以看作是对象。一个汽车就是一个汽车对象,汽车模具就可以看作“类 ”
用引用操作对象
操作的标识符是对象的一个reference(引用)。
我们不关心这个引用是否有一个对象实际和他关联。只需要知道这个引用后面有块空间和它对
应就好了。
1 | String i; |
这只是声明一个引用,这个引用的后面没有一个对象和他关联。她仅仅是个引用。
但是为了安全性考虑,一般创建一个引用的同时会对其进行初始化。
1 | String s = new String("abc"); |
对于特殊的基本数据类型来说。
1 | int i; // error |
我们是建议定义一个局部变量时,就进行变量初始化。避免编译时报错。
所以在程序中无论是声明定义一个基本类型变量,还是对象变量,最好要进行初始化,避免出
现问题(基本类型会有默认值影响,对象会出现空指针异常)
存储数据的位置:
寄存器:
最快的存储区,在CPU内,Java无法操作该区域。
堆栈:
很少使用,(忽略)(基本数据类型就在这个里面)
堆:
存放所有的Java对象的存储区,一种通用的内存池(位于内存(RAM)中)。无线知道数据
的生命周期,需要一个对象时,只需要执行new指令,就可以自动在堆内进行存储分配。
(Java实际上无法在堆栈中直接操作对象,C++可以)
对于堆和堆栈来说,其实都是在内存中,但是内存管理方式不同,所以分成不同的空间进行定
义。
常量存储:
字符串常量池。位于特殊的静态存储区中(一般物理设备为ROM(只读存储器))
非RAM存储(例如硬盘以及其他服务器):
流对象(发送到另一台机器)
持久化对象(存储在磁盘上)
特殊情况
我们一般都说在Java中数据类型有两种,一种是基本类型,一种是引用类型。
引用类型new出来的是是将对象存储在“堆”中的,而基本类型是创建一个并非是引用的“自
动 ”变量,直接存储在堆栈中,更加高效。
高精度数据类型:
Java提供两个用于高精度计算的类: BigIngeter和BigDecimal分别对应的是int和float。高精
度会导致运算速度慢,典型的速度换准确度。
高精度数据类型主要用于进行要求精度比较高的货币计算。(财务计算使用)
Java中的数组:
数组是相同数据类型的长度固定的集合。Java的数组是通过以少量的内存开销以及运行时期的
下标检查为代价(性能的销户),带来的是Java数组的安全性和效率的提高。
Java的垃圾回收机制:
之前就谈过了,new出来的对象和基本类型数据他的存储位置是不同的,一个是堆,一个是堆
栈,所以他们的生命周期也是不一样的。对于堆内存中的对象来说,对象不再进行引用了,就
会释放内存空间资源了,在Java中我们通过守护线程GC进行自动回收,避免很多内存溢出问
题。
Java的基本类型默认值:
类的成员变量是基本数据类型它是有默认值的,所以需要确保基本类型的成员能够得到初始化,防止出错。
主要的基本数据类型默认值有:
基本数据类型 | 默认值 |
---|---|
boolean | false |
char | ‘\u0000’(null) |
int | 0 |
double | 0.0d |
static关键字:
执行new来创建对象时,数据存储空间才会被分配,对象的方法才能提供外界进行调用。
当声明一个事物是static时,意味着属性或者方法不会与任何包含它的类的任何对象实例进行关联。所以不需要对象实例,也可以通过调用其static方法或者访问static域(属性)。
1 | class StaticTest { |
通过StaticTest类new出来两个对象,但是st1和st2的i是共享同一份存储空间的。
1 | StaticTest.i++; |
i++之后,st1和st2的i值是相同的。
在每个.java文件的开头,必须声明import
语句,但是有一个特殊的包直接自动默认导入的,这个包就是java.lang
包,所以我们可以在不使用import语句的情况下,直接使用System.out
等等方法。
比较常用的Javadoc标签有:
@Deprecated
:表示旧特性已经被改进的新特性进行取代,建议用户不要再使用这些旧特性,
可能会被删除。