1.虚拟机栈作用:
使用方法时,首先方法进去栈空间,方法里面的信息也会进去,形成栈帧。
形成对象时会执行方法(如new Person())也还是如此运行,形成栈帧。在形成对象时,对象里面的方法可以看作在方法区的类的信息里面
2.堆的作用
对象会出现在堆里面,由栈中的变量指代其地址,对象里面的属性名会存放在里面
那么,对象里面的属性怎么被堆知道的呢?
这就要涉及到方法区
3.方法区的作用
因为方法区会有类的信息,因此堆会知道,所以堆中的对象会知道对象的属性等信息,不过由于方法没必要重复,所以对象里面的方法可以看作在方法区的类的信息里面
注意:
1.因为方法区不会重复出现同一个类信息,所以之后每个新创建的对象的属性名的数据都是从中的来
2.因为方法区里不会重复出现同一个方法,所以之后每个新创建的对象的方法都是同一个方法。
3.构建不同的对象时,输入不同属性值时,属性名对应的属性值不同。这是因为属性值都放在方法区的常量池里面,所以根据同一个类构建出来的对象虽然属性名相同,属性值不同。
4.实例介绍
class Person{
String name;
int age;
public void show(){
System.out.println("姓名"+this.name);
}
}
public class TestPerson {
public static void main(String[] args) {
// 创建p对象
Person p=new Person();//创建完毕,被移出栈,因为构造方法在创建一个对象后销毁
p.name="zx";
//这个name被赋值后,不是进入堆中,而是进入常量池中,不过属性名还在堆
p.show();//调用时,show出现在栈中,传一个隐含this,这里this指的是p所指的对象,形成一个栈帧,然后调用该方法,调用完毕,出帧
// 创建p1对象
Person p1=new Person();//方法区不会重复出现同一个类信息,不过会在堆里面再出现一个对象的地址
p1.name="zyp";
p1.show();//调用时,show出现在栈中,传一个隐含this,这里this指的是p1所指的对象形成一个栈帧,然后调用该方法,调用完毕,出帧
//p1.show()执行后将name的属性值再传入方法区的常量值,这个与p1原来传的互不影响,然后main方法调用完毕,main方法销毁,
}
}