阅前说明:本系列笔记仅记录读书过程中本人不会或不熟的知识点。
第2章 一切都是对象
2.2 必须由你创建所有对象
2.2.1存储到什么地方
有五个地方可以存储数据
- 寄存器
- 在CPU的内部,最快的存储区,但是空间很小。
- 无法直接控制,写程序时也感受不到(C、C++允许建议寄存器的分配方式)
- 堆栈
- 位于RAM(随机存储器)中,速度仅次于寄存器。
- 堆栈指针向下(上)移动,则分配新的(释放那些)内存。
- Java对象的引用就存在这里。
- Java中的基本数据类型也存在这里。
- 堆:
- 位于RAM(随机存储器)中,速度仅次于寄存器。
- 一种通用的内存池,用来存放所有的Java对象,执行new关键字时就在堆区分配存储。
- 编译器不需要知道存储的数据在堆里存活多长时间。
- ∴灵活性高,SO分配存储和清理空间要比堆栈开销大。
- 常量存储:
- 常量值通常直接放在程序代码内部,不可更改,但有时(嵌入式系统),存放在ROM(只读存储器)中。
- 例如字符串池,所有String类型的和具有String的常量表达式都是自动内存限定的,并且置于特殊的静态存储区中。
- 非RAM存储:
- 通常指磁盘,不受程序控制,断电可存在
- 将对象转化成可以存放在其他媒介上的事务,在需要时,可以被恢复到内存中。
- 两个例子:
- 流对象:对象转化为字节流,通常发给另一个机器
- 持久化对象:对象被放在磁盘上。
- 例如:JDBC和Hibernate这样的机制
2.2.2 特例:基本类型
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | —— | —— | —— | Boolean |
char | 16-bit | Unicode 0 | Unicode 2¹⁶-1 | Character |
byte | 8 bits | -128 | 127 | Byte |
short | 16 bits | -2¹⁵ | +2¹⁵-1 | Short |
int | 32 bits | -2³¹ | +2³¹-1 | Integer |
long | 64 bits | -2⁶³ | +2⁶³ | Long |
float | 32 bits | IEEE754 | IEEE755 | Float |
double | 64 bits | IEEE754 | IEEE755 | Double |
void | —— | —— | —— | Void |
- 这些基本数据类型,直接将变量名和值一同存储在堆栈中。
- 所有的数值类型都有正负号,所以不要去寻找无符号的数值类型。
- boolean类型所占存储空间大小没有明确指定,仅定义为能够取字面值true或false。
- 基本数据类型具有的包装器类使得可以在队中创建一个非基本对象,用来表示对应的基本数据类型。
高精度数字类型:BigInteger和BigDecimal
- 这俩虽然也属于包装类,但没有对应的基本数据类型。
- 能作用与int和float的操作,也同样能作用于BigInteger和BigDecimal,只不过必须以方法调用的方式取代运算符的方式来实现,有点复杂,所以运算速度会慢,相当于用时间换了精度。
BigInteger:支持任意精度的整数而不会丢失任何数据
BigDecimal:支持任何精度的定点数。
2.4 创建新的数据类型:类
2.4.1字段和方法
类中基本数据类型字段的默认值:
基本类型 | 默认值 |
---|---|
boolean | false |
char | /u0000’(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
- 如果一个类中的某个字段是基本数据类型,即使没有初始化,Java也会确保它获得一个默认值,如上表所示。
- 但是如果是在局部变量中(比如方法体里面),例如:int x; 这样的语句,那么变量x得到的可能是任意值,而不会自动初始化为0,在编译时,java编译器会报错。
2.5 方法、参数和返回值
方法名和参数列表(合起来叫"方法签名")唯一地标识出某个方法。
public class test01 {
public static void main(String[] args) {
//获取所有系统属性,以列表方式打印到控制台
System.getProperties().list(System.out);
//获取系统属性中的用户名并且打印到控制台
System.out.println(System.getProperty("user.name"));
//获取系统属性中的java.library.path并且打印到控制台
System.out.println(System.getProperty("java.library.path"));
}
}
2.8 注释和嵌入式文档
- javadoc只能识别/** */文档注释
- javadoc只能为public和protected成员进行文档注释
- 不要在注释嵌入的html中加入标题标签,因为javadoc会产生自己的标题,可能会和你的发生冲突。