- zx_code
- 等级: 初级会员
- 性别:
- 文章: 3
- 积分: 60
- 来自: 南京
|
发表时间:2014-01-10
最后修改:2014-01-10
今天很想弄明白对象这个东西,平时我们说java创建一个对象就是在jvm的堆中开辟一片内存空间,那这些内存空间究竟放得啥,对象又是如何调到类的方法的???
例如:
class Test {
int n = 0;
String name = “hello”;
int add(int a)
{
return a+n;
}
}
Test test = new Test(); 我们说创建一个test类,也就是说在jvm的堆中开辟一片空间用来存储n和name这2个变量,test调用add,jvm怎么调用的呢?到底这个对象包括哪些信息,是不是test.getClass();获取类的信息,然后获取方法。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- LinApex
- 等级: 初级会员
- 性别:
- 文章: 77
- 积分: 80
- 来自: 深圳
|
test调用add时,通过 test 这个引用去调用 jvm 方法区的方法.
对象包括这个对象的所有信息,它的自身属性,所有父类属性,方法,常量,接口,内部类等等等.
test.getClass(); 获取类的信息,这是反射.
|
返回顶楼 |
|
|
- Shen.Yiyang
- 等级: 初级会员
- 文章: 66
- 积分: 30
|
堆区除了非静态字段的值或者引用,还包括类型的引用;类型对象就在方法区当中。
|
返回顶楼 |
|
|
- 那家渔村
- 等级: 初级会员
- 性别:
- 文章: 4
- 积分: 30
- 来自: 北京
|
在HotSpot中,一个java对象由两个字长的对象头和对象的域值组成。其实java对象就是一个类结构体,占用一片连续的内存片。所谓的域值,就是指java对象的实例域值,而非静态域。而且和C的结构体一样,也存在布局与填充,并且排列具有一定的规则。具体介绍请看这篇文章。http://www.importnew.com/1305.html
|
返回顶楼 |
|
|
- 那家渔村
- 等级: 初级会员
- 性别:
- 文章: 4
- 积分: 30
- 来自: 北京
|
接上面。java中的任意方法编译出来的字节码全部放在JVM的方法区中,与类型Class对象一起存放。每个Class对象内部存放了一张方法表,里面记录着类的实例方法的入口。所谓的实例方法其实就是非静态方法和非私有方法。前面说的每个java对象都存在这两字长的对象头,其中有一个字就存放着该对象所属的Class对象的地址。当调用对象方法时,就通过Class中维护的方法表进行调用。方法表也就是java多态机制的实现细节。
|
返回顶楼 |
|
|
- RednaxelaFX
- 等级:
- 性别:
- 文章: 576
- 积分: 1110
- 来自: 海外
|
之前写的这帖楼主或许会感兴趣: 借HSDB来探索HotSpot VM的运行时数据,主要是讲对象的成员变量,类静态变量,方法的局部变量之类的数据在JVM里都是放哪儿的。
|
返回顶楼 |
|
|
- TranCoffee
- 等级: 初级会员
- 文章: 2
- 积分: 30
|
楼上是高手,对JVM非常了解,在《深入理解JVM》一书中作者提到过。 --- 最重要人很热心!
|
返回顶楼 |
|
|