对象如何存储在堆中?
一个对象如何存储在堆中。 例如,可以像这样定义自行车类:
public class Bicycle {
public int gear;
public int speed;
public Bicycle(int startSpeed, int startGear) {
gear = startGear;
speed = startSpeed;
}
public void setGear(int newValue) {
gear = newValue;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
那么我可以创建一个自行车对象:
Bicycle bicycle = new Bicycle(20,10)
那么这个自行车对象应该堆放在一起。 但我不明白堆是如何精确地存储这些实例变量和方法,如速度和齿轮。我明白堆应该实现为树。 那么这个对象如何存储在树中? 同样,当你使用bicycle.speed
来查找速度值时,复杂度会是多少?
想要别人来做你的CS作业吗? ;)
根据不同的语言,确切的实现将会有所不同(它如何存储在内存中),但一般的概念是一样的。
你有你的堆栈内存和你的堆内存,局部变量和参数放在堆栈上,每当你有new
东西进入堆中。 它被称为堆栈,因为当你声明它或调用一个函数时,值被推到它上面,然后弹出并且超出范围。
+--------------+ | | | | | | | | | | | | | | | | | | | | | | | | +--------------+ Stack Heap
每个实例变量都会占用其类型所占用的大量内存(取决于语言),编译器会将其全部添加,这就是类型的sizeof
(àla C ++)。 方法进入代码空间,并没有得到new
进入对象(我认为现在你最好不要考虑如何组织内存,只是把它想象成魔术)。
所以在你的例子中:
Bicycle bicycle = new Bicycle(20,10)
bicycle
是堆内存地址的一个参考,今天在大多数语言/系统中,它将花费您32或64位的堆栈空间。 new
内存分配在堆中。 编译器计算出Bicycle的大小,并创建汇编/机器代码来分配它需要的内存量。 这就是内存在这条线之后的样子:
+--------------+ | | | Bicycle obj | | | |--------------| | | | | | | | | |--------------| | | | bicycle ref | | | +--------------+ Stack Heap
更具体地说,因为Bicycle类有两个实例变量(或者它们在Java中调用的字段)并且都是int
,并且Java中的int
是32位或4字节,所以Bicycle对象的大小是4字节* 2字段= 8个字节。
+-------------+ | | 0| gear | | | 4| speed | | | |-------------| | | 8| | |-------------| 12| | | bicycle=0x4 | | | +--------------+ Stack Heap
访问存储器的时间复杂度是O(1)。 编译器能够计算出确切的speed
内存地址,因为对象中的第二个int字段位于自行车+ 0x4处。
Bicycle bicycle = new Bicycle(20,10)
参考自行车将被存储在stack
而对象和实例变量将被存储在heap
, heap
的地址被分配到堆栈中,因此意味着堆栈将链接到堆。
首先,你应该从Java方面理解Object的含义。
对象只不过是堆中的一个缓冲区(内存区域)。 该缓冲区或内存区域称为对象。
Object包含该类的所有非静态数据成员。
一切-
对象存储在堆中。
静态数据成员存储在Class Area中。
参考变量存储在Stack中。
方法(静态或非静态)存储在方法区域中。
链接地址: http://www.djcxy.com/p/82833.html