《编程思想》2.一切都是对象

1.数据存储

  • 寄存器: 最快的存储区,位于处理器内部。但寄存器的数量及其有限,所以寄存器根据需求进行分配
  • 堆栈:位于随机访问存储器中,通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便于上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些Java数据存储位于堆栈中,特别是对象引用,但是Java对象并不存储于其中。
  • 堆:一种通用的内存池,用于存放所有的Java对象。堆不同于堆栈的好处:编译器不需要知道存储的数据在堆中存活多长时间。当执行new对象,会自动在堆里进行存储分配。但耗时比堆栈长
  • 常量存储:常量值通常直接存放在程序代码内部。因为它们永远不会被改变。
  • 非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。两个基本的例子:流对象 和 持久化对象

2.特例:基本类型

  1. new将对象存储在堆中,故用new创建一个对象----特别是小的,简单的变量,往往不是很有效
  2. 对于基本类型,不用new来创建变量,而是创建一个并非是引用的"自动"变量。这个变量直接存储值并置于堆栈中,因此更加高效。
  3. 基本数据类型所占存储空间大小的不变性是Java程序比其他大多数语言编写更具移值性。
  4. 基本类型具有的包装器类,使得可以在堆中创建一个非基本对象。
  5. 提供了两个用于高精度计算的类:BigInteger和BigDecimal 。二者都没有对应的基本类型。所包含的方法中操作与对基本类型的操作相似。必须用方法调用,精度换速度。

3.数组

  1. 当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null

4.对象的作用域

  1. 当用new创建一个Java对象时,它可以存活于作用域之外。 {String s = new String("aa"); }   引用s在作用域终点消失。然而,s指向的String对象仍然继续占据内存空间。在作用域之后,无法访问这个对象,因为对他唯一的引用已超出了作用域的范围
  2. Java垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。

5.默认值

  1. 当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些是基本数据类型的成员变量得到初始化,防止产生程序错误。
  2. 初始化的方法并不适合“局部"变量。因此,如果在某个方法定义中有 int x ; , 那么变量x得到的可能是任意值,而不会被自动初始化为零。

6.参数列表

  1. 像Java中任何传递对象的场合一样,这里传递的实际也是引用。(对于特殊数据类型boolean, char, byte, short, int, long, float 和 double来说是一个例外。通常,尽管传递的是对象,而实际上传递的是对象的引用

7.static 关键字

  1. 执行new来创建对象时,数据存储空间才被分配。
  2. 当申明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
  3. 一个static字段对每个类来说都只有一份存储空间,而非static字段则是每个对象都有一个存储空间

猜你喜欢

转载自blog.csdn.net/weixin_42763504/article/details/82752519