常常看到像这样的语句
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栈