论坛首页 Java企业应用论坛

java对象,创建一个对象,这个对象在堆里到底存啥

浏览 5149 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间: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();获取类的信息,然后获取方法。

 

   发表时间:2014-01-10  
test调用add时,通过 test 这个引用去调用 jvm 方法区的方法.

对象包括这个对象的所有信息,它的自身属性,所有父类属性,方法,常量,接口,内部类等等等.

test.getClass(); 获取类的信息,这是反射.
0 请登录后投票
   发表时间:2014-01-13  
堆区除了非静态字段的值或者引用,还包括类型的引用;类型对象就在方法区当中。
0 请登录后投票
   发表时间:2014-01-15  
在HotSpot中,一个java对象由两个字长的对象头和对象的域值组成。其实java对象就是一个类结构体,占用一片连续的内存片。所谓的域值,就是指java对象的实例域值,而非静态域。而且和C的结构体一样,也存在布局与填充,并且排列具有一定的规则。具体介绍请看这篇文章。http://www.importnew.com/1305.html
0 请登录后投票
   发表时间:2014-01-15  
接上面。java中的任意方法编译出来的字节码全部放在JVM的方法区中,与类型Class对象一起存放。每个Class对象内部存放了一张方法表,里面记录着类的实例方法的入口。所谓的实例方法其实就是非静态方法和非私有方法。前面说的每个java对象都存在这两字长的对象头,其中有一个字就存放着该对象所属的Class对象的地址。当调用对象方法时,就通过Class中维护的方法表进行调用。方法表也就是java多态机制的实现细节。
0 请登录后投票
   发表时间:2014-02-05  
之前写的这帖楼主或许会感兴趣:借HSDB来探索HotSpot VM的运行时数据,主要是讲对象的成员变量,类静态变量,方法的局部变量之类的数据在JVM里都是放哪儿的。
0 请登录后投票
   发表时间:2014-03-05  
楼上是高手,对JVM非常了解,在《深入理解JVM》一书中作者提到过。
--- 最重要人很热心!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics