解释下面的图:
方法区:(最先有数据) :
Phone .class{
//成员变量
String brand;
double price;
String color;
//成员方法
void call(String who)
void sendMessage()
}
Demo01PhoneOne.class{
main(String[]args)
}
谁有main方法 谁先开始, 运行就进栈,进栈也叫 压栈(先来的在地下,后来的在上面)
看第一行:创建了一个局部变量(Phone one),那么变量当然是保存一些内容的,往右边看,nwe Phone();
凡是 nwe的东西都在堆当中。那么nwe Phone(); 里面的东西在方法区,分别是成员变量(赋上默认值)和成员方法。
注意在这里的成员方法:对于一个对象来说,它的成员方法保存的其实是一个地址值。也就方法区的成员方法的地址值会保存在堆当中。那么newPhone有(成员变量和成员方法)也有个地址值,也就是把这个地址值(堆)赋值给了(栈)当中的 Phone one ;当然根据这个地址就能找到这个对象。接下来就访问下
one…brand;one.price;one.color;那么里面的默认值怎么来的,根据栈中的one 就能访问到了堆存储的所有成员变量的值,
接下来改变他们的数值,在栈当中,给one.brand,等它们三个(赋值) = “苹果”;8388.0;黑色;这样堆当中的成员变量就变了。 苹果 ;8388.0;黑色。接下来到(栈)当中one.call(“乔布斯”);和one.sedMessage。根据one.call(“乔布撒”);的one就能找到Phone one 的值,但是call是方法,所以过程是:从栈找到堆,想用的是方法,那么就根据成语方法找到了方法区的成员方法,找到了call(String who),那么想要运行 必须call(Stringwho) 进栈,那么call(String who)要做什么事情那,看参数是谁就是 “给”+ eho+“打电话”。那么这样就完事了,完了以后会立刻马上出栈(弹栈) “ X 代表” 就是在栈内存当中消失。然后排到了one.sendMessage,同样的也进栈,运行,显示是群发短信,完事立刻马上也是出栈。在往后走,就到了main方法最后一行,那么main方法也完事了,也是要出栈的,那么所有的内存都消失不见,程序停止