当前位置: 代码迷 >> Java相关 >> 实例化与内存分配解决方法
  详细解决方案

实例化与内存分配解决方法

热度:10073   发布时间:2013-02-25 21:47:13.0
实例化与内存分配
常常看到像这样的语句
Person per=new Person()
栈中存放了per存放了指向了 Person实例的地址,在堆中存放了Person 的实例。
问题:
Person per=new Person();
1,在堆中内存分配的大小是根据Person 里面变量的大小来分配的吗?
2,如果是:具体实例的 age 属性应该是放在堆中的吧? 
3,属性 name,ch 又是放在哪里的?

Java code
class Person{    String name;    int age;    Child ch;    public void say()    {        System.out.println("I am fater");    }    public void work()    {        System.out.println("I hava a job");    }}class Child extends Person{    public void say()    {        System.out.println("I am child");    }    public void dance()    {System.out.print("I can dance");}}






------解决方案--------------------------------------------------------
1,在堆中内存分配的大小是根据Person 里面变量的大小来分配的吗?

-->对内存的大小应该是Person的变量的 内存大小 String name+ int age + Child ch;

2,如果是:具体实例的 age 属性应该是放在堆中的吧?

 --->存放基本类型的数据和对象的引用,应该是在栈中吧 

3,属性 name,ch 又是放在哪里的?

 ---》在栈中创建一个对String类的对象引用变量name , ch应该也是在栈中创建一个Child类的对象的引用变量ch 

------解决方案--------------------------------------------------------
Person per=new Person()
栈中存放了per存放了指向了 Person实例的地址,在堆中存放了Person 的实例。
问题:
Person per=new Person();
1,在堆中内存分配的大小是根据Person 里面变量的大小来分配的吗?
no,java虚拟机还会在对象里加入额外的内容,如gc相关的标识,指向Class对象的引用等协助对象工作的东西

2,如果是:具体实例的 age 属性应该是放在堆中的吧?
Person对象都在堆里了,其上的字段当然在堆里

3,属性 name,ch 又是放在哪里的?
同问题2,作为person对象的属性,name,ch也在堆里,可以想象成一个c++语言的结构体(不一定真是结构体),name和ch是指向其他对象的指针



------解决方案--------------------------------------------------------
jvm规范没有规定该如何表示一个java对象,可能是c++的struct,又可能是其他jvm开发者认为对自己实现的jvm有利的结构
------解决方案--------------------------------------------------------
必须可以!只有方法调用的时候才会涉及的java栈

探讨

引用:
Person per=new Person()
栈中存放了per存放了指向了 Person实例的地址,在堆中存放了Person 的实例。
问题:
Person per=new Person();
1,在堆中内存分配的大小是根据Person 里面变量的大小来分配的吗?
no,java虚拟机还会在对象里加入额外的内容,如gc相关的标识,指向Class对……
  相关解决方案