首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

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

2012-03-27 
实例化与内存分配常常看到像这样的语句Person pernew Person()栈中存放了per存放了指向了 Person实例的地

实例化与内存分配
常常看到像这样的语句
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对……

热点排行