Java作为OOP语言,抽象性不言而喻。如果需要深入了解Java语言的实现机制,则不得不对Java语言中基础的概念有清晰的了解。今天是我在cnblog上写博客的第一天,希望今天的博客可以是我成为未来"大牛"跨出的第一步。
面向对象语言中,对象概念其实挺抽象的,对于初学者甚至有开发经验的同志来说都不太容易弄明白。最近看到这篇牛人写的文章,觉得蛮受益的,和大家共同分享吧。翻译有些拙劣,"大牛"请忽略我直接看原文,嘻嘻~。
We know functions are implemented in memory as a stack of activation records. And we know Java methods are implemented as a stack of frames in JVM Stack and Java objects are allocated in Heap.
函数在内存中通过一堆"活动记录"(activation record,活动记录也叫栈帧)实现。我们也知道Java方法在虚拟机栈中通过一堆"栈帧"(stack frame)实现,Java对象在"堆"(Heap)中分配内存空间。
COMMENT1:
1)Java中funtion和procedure统称为method。一般来说function和procedure是有区别的(当然很多编程书上是混用的,我也是无语==!)
funtion -- 无返回值(void或构造函数那样返回值类型都没写的)的method; procedure -- 有返回值的method
2)栈帧(stack frame)也称活动记录(activation record)。method在被调用(called)时会将方法区的方法压入栈帧,栈帧中保存有局部变量,返回值类型等信息。具体内容本文不深究。
How do Java objects look like in heap? Once an object is laid out in memory, it's just a series of bytes.
Java对象在"堆"中到底长得啥样呢?一旦对象被放到内存中,此时它仅仅就是一系列的字节。
Then how do we know where to look to find a particular field? Keep an internal table inside the compiler containing the offsets of each field.
那么我们是如何知道到哪里去查看、寻找这样一个特别的字段(field)的呢?在编译器内部保存有一张包含每一个字段偏移量的表。
COMMENT2:
1)field有的译作"域"、"字段",其实都是一个意思。都是指类的成员变量(包括static成员变量,只不过static存放在方法区,属于类,所有类对象共享)
2)对象成员变量自动寻址:编译器内部会保存一张虚拟表(Virtual Table or called Vtable),包括每个对象成员变量相对于对象空间首地址(第一个成员变量)的地址偏移量,这
样就可以轻松地访问对象的成员变量了。
Here is an example of an object layout for class "Base"(B). This class does not have any method, how methods are laid out in memory is in the nextsection.
举个Base类实例对象的例子。这个类没有任何的方法,它的方法如何在内存中被安排放置将在下一部分中解释。