先上一段代码:
package Object;
public class SxtStu {
int id;
int age;
String sname;
Computer comp;
void study(){
System.out.println("我在认真学习使用的"+comp.brand);
}
void play(){
System.out.println("我在玩游戏—");
}
SxtStu(){}//构造器构造方法,用于创建这个类的对象。
public static void main(String[] args) {
SxtStu stu=new SxtStu();
stu.id=1001;
stu.sname="Jay";
stu.age=18;
Computer c1=new Computer();
c1.brand="联想";
stu.comp=c1;
stu.study();
}
}
class Computer{
Stri
来看看这段代码是怎么运行的:
1 调用JVM执行类,加载代码,放在方法区。
2 找main方法,程序从main方法中开始执行,执行main方法开辟栈帧,放置局部变量stu=null。
new SxtStu()调构造方法 在栈中创建一个栈帧
3 执行完毕在堆中创建对象,对象中有属性,有方法,id=null.sname=null.age=0.comp=null. study().play();stu对象的地址15db9742
4 执行赋值符号,把创建好的对象给stu 。stu=15db9742。
5 执行 stu.id=1001 时通过栈stu 找到堆id。执行stu.sname="Jay"。把方法区中的字符串地址给堆
6 执行 stu.comp=c1把c1的值赋给stu
栈:放置局部变量,每个方法被调用会创建一个栈帧。JVM为每个线程创建一个栈,存放该线程:局部变量。栈是线程私有,先进后出。是一个连续的内存空间。
堆:放置new出来的对象,只有一个堆被线程共享,不连续的内存空间,分配灵活,速度慢。
方法区:类信息(Class对象),静态变量,静态方法字符串常量。存放程序唯一不变的内容。