前记

最近重温 Java 的基础思想和设计,想看看《Java 编程思想》,后来得知第五版改名为《On Java 8》了,更新了一些东西。

海边拾贝,边读边写,温故知新。

对象创建

内存分配(4.2.1)

程序在运行时如何存储的呢?

  • 寄存器(Registers)

    位于 CPU 内部,速度最快,数量极少,无法在我们的程序中获取控制权,按需分配。

  • 栈内存(Stack)

    位于 RAM 中,通过栈指针获得处理器的支持,栈指针,下移分配内存,上移释放内存。创建程序是,Java 程序需要准确地知道栈内保存的所有对象的生命周期,由于该约束限制了程序的灵活性。

    栈内存上存放了一些 Java 程序的数据,特别是对象引用(临时变量),但对象是存放在堆内存。

  • 堆内存(Heap)

    位于 RAM 中,所有的 Java 对象都在堆中,new 一个对象时,会自动在堆上进行内存分配。编译器不用知道对象需要在堆上停留的时间,所以具备灵活性,但是弊端是分配和清理内存消耗的时间会更长。

  • 常量存储(Constant Storage)

    位于堆内存的常量池,代码是存储在堆内存的方法区;

  • 非 RAM 存储(No-RAM Storage)

    脱离于程序以外的,一般位于ROM 上。典型的有:

    1. 持久化对象:文件、数据库。

    2. 序列化对象:对象被转换为字节流,通常被发送到另一台机器。

基本类型的存储(4.2.2)

  • new 的对象位于堆中

  • 不使用 new 创建变量,而是使用一个自动变量,该变量直接存储
    并置于栈内存中,因此更加高效。

    我的理解是:匿名临时变量

对象清理(4.4)

作用域(4.4.1)

  • 基本变量

    作用域由{ }决定

    1
    2
    3
    4
    5
    6
    {
    int x = 0;
    {
    int y = 1;
    }
    }
  • new 对象

    出离了{ }str 的引用依然存在,需要等 Java 的垃圾收集器检查所有 new 出来的对象并判断哪些不再可达,继而释放那些被占用的内存后,才能供其他新的对象使用。

    1
    2
    3
    {
    String str = new String("java")
    }

类的创建(4.5)

基本类型默认值(4.5.3)

  • char: \u0000(null) 、byte: (byte)0 、short: (short)0

  • Java 在初始化类的时候回赋予默认值,但是不适用于局部变量,即不属于类的字段的变量。

方法使用(4.5.4)

  • 法名和参数列表统称为方法签名(signature of the method)。签名作为方法的唯一标识。

写在最后

版本内容时间
v1.0.01. 创建文档
2. 做了第四章的阅读笔记
2020-06-01 19:30:14