References, Recursion, and Lists

https://sp18.datastructur.es/

Bits: 计算机将信息存储为内存,并使用0或1的位序列表示此信息。

Primitives: Primitives是信息的表示。 Java有8种原始类型:byte, short, int, long, float, double, boolean, and char。每个基本类型由一定数量的位表示。例如,整型是32位,而字节是8位。

**声明基元:**当我们将变量声明为基元(即int x;)时,我们预留了足够的存储空间来保存位(在本例中为32)。我们可以认为这是一个存放位的盒子。然后,Java将变量名称映射到此框。假设我们有一行代码int y = x; x之前定义的位置。 Java会将 x 框内的位复制到 y 框内的位。

创建对象:当我们使用new关键字创建类的实例时,Java为每个字段创建位框,其中每个框的大小由每个字段的类型定义。例如,如果一个Walrus对象具有一个int变量和一个double变量,则Java将分配两个框,总计96位(32 + 64)以容纳两个变量。这些将被设置为默认值,例如0。然后,构造函数进入并将这些位填充为适当的值。构造函数的返回值将返回盒子所在的内存位置,通常是64位地址。然后可以将该地址存储在具有“引用类型”的变量中。

**引用类型:**如果变量不是原始类型,则它是引用类型。当声明对象变量时,我们使用引用类型变量将对象所在位置的地址存储在内存中。请记住,这就是构造函数返回的内容。引用类型始终是大小为64位的框。请注意,该变量不会存储整个对象本身!

**等于的黄金法则:**对于基元,线y = xx框内的位复制到y框。对于引用类型,我们做的完全相同。在“ Walrus newWalrus = oldWalrus;”行中,我们将oldWalrus框中的64位地址复制到newWalrus框中。因此,我们可以将此等价黄金法则(GroE)视为:当我们给一个等于等值的值时,我们只是将位从一个存储盒复制到另一个存储盒!

**参数传递:**说我们有一个方法 average(double a, double b)。此方法以double为参数。参数传递也遵循GRoE,即,当我们调用此方法并传递两个double时,我们将这些变量中的位复制到参数变量中。

**数组实例化:**数组也是对象,也可以使用new关键字实例化。这意味着声明一个数组变量(即int [] x;)将创建一个64位引用类型变量,该变量将保存该数组的位置。当然,现在,此框包含空值,因为我们尚未创建数组。数组的新关键字将创建该数组并返回该数组在内存中的位置。因此,通过说int [] x = new int [] {0,1,2,3,4} ;,我们将这个新创建的数组的地址设置为变量x。注意,数组的大小是在创建数组时指定的,不能更改!

**整数列表IntLists:**使用引用,我们递归定义了IntList类。 IntList是可以更改大小(与数组不同)的整数列表,并且可以存储任意数量的整数。可以通过递归或迭代来完成大小帮助程序的编写。