1.Java以引用的方式操作对象
“If we spoke a different language, we would perceive a somewhat different world!” –Ludwig Wittgenstein
在处理数据时可以直接对数据本身上进行操作,也可能通过一些间接的表现形式(如C 和C++中的指针操作)。
在Java语言中,我们把一切看作对象出来,我们所操作的对象的标志符实际上是对象的一种“引用reference”。
2.对象必须显式创建
当我们创建一个引用时,我们要把该引用和具体的对象连接起来。一般我们通过new操作符完成。
//Create an object with new operator
User user = new User();
上述代码设计三部分内存区域:
- JVM栈区,存放对象的reference;
- heap堆区:存放对象实例数据;
- 方法区:存放对象类型数据。
3.存储位置
有五个不同位置存放数据:
- 寄存器
这是最快的存储位置,因为它是位于处理里内部的,所以我们不能直接控制。 - 栈区
该位置位于计算机的ram区域,通过栈指针得到处理器的直接支持。速度是处于寄存器之下第二快的位置,系统需要知道所有存放在该位置数据的生命周期,这限制了程序的灵活性。所以尽管java数据存放在栈上–特别的,如对象引用–但对象本身并不存放在栈上。 - 堆区
这是一种通用目的的内存池(这部分也属于RAM区域),所有java对象存放在该部分内存区域。运行时,内存被分配给对象,程序员不用进行清理工作。灵活性的代价是:这将话费更多时间在内存分配和内存清理工作上,相较于存放在栈上的数据而言。 - 常量内存区
常量值通常直接放在程序代码中,因为这些值永远不会改变,所以这样做很安全。有时,常量值会从自身剥离,所以这样它们就可以选择性地放在ROM中,这常用于嵌入式系统中。 - 非RAM内存区:
如果数据完全存在于程序之外,则该数据可以在程序不执行的时候存在,脱离程序的控制。2个主要的例子是:流对象和持久层对象。流对象是指,对象被转化为字节流,一般用来从一个对象送到另一个对象。持久层对象是指,对象是存放在磁盘中,所以它们及时在程序终止时依然可以保存其状态。
4.基本数据类型–Special cases
对于基本类型数据做特殊处理的原因是:我们通过new操作符的方法创建一个新对象效率不高,尤其创建的变量小而简单,因为通过new操作符创建的对象都存放在heap上。
java决定了每种基本数据类型的大小,这才是真正的跨平台的,因为它不依赖系统架构,是稳定不变的!
boolean:–
byte:8 bits
short:8 bits
char: 16 bits
int: 32 bits
long: 64 bits
float: 32 bits
double: 64 bits
void:–
Java 提供了Wraper class包装类来处理基本数据类型,这样使得我们可以在heap上创建基本类型数据的表示。同时,java提供的auto-boxing机制能够将基本类型数据转换到包装类数据,反之亦然。
5.高精度数据
Java提供了2个高精度算术计算的类:BigInteger 和 BigDecimal.
BigInteger: 支持任意精度的整数,这意味着我们可以在操作过程中不丢失任何精度地表示任何大小的整形值。
BigDecimal:支持任意精度的固定小数点数据;比如我们可以用作精确的货币计算操作。