日期:2014-05-20  浏览次数:20778 次

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