在Java虚拟机中,有三块主要的空间(还有其他的空间在这里不一一阐述):
package com;
public class Demo2 {
public static void main(String[] args) {
System.out.println("main begin");
int x = 100;
m1(x);
System.out.println("main over");
}
public static void m1(int i){
System.out.println("m1 begin");
m2(i);
System.out.println("m1 over");
}
public static void m2(int i){
System.out.println("m2 begin");
m3(i);
System.out.println("m2 over");
}
public static void m3(int i){
System.out.println("m3 begin");
System.out.println(i);
System.out.println("m3 over");
}
}
执行结果:
main begin
m1 begin
m2 begin
m3 begin
100
m3 over
m2 over
m1 over
main over
执行过程:
先把整个class Demo2的代码放入方法区==>Demo2.class
进入主方法,输出main begin;
在栈中分配x的空间,并把x赋值为100;
调用m1方法,在栈中分配m1的空间,并把形参赋值为x;
执行m1方法中的代码,输出m1 begin;
调用m2方法,在栈中分配没m2的空间,并把形参值赋值为x;
以此类推......
(三个i和一个x这四个变量都是局部变量,存在栈内存中,堆内存存放的是成员变量)
如果有:
int x = 100;
int z = 100;
这两个变量在栈中各占一块内存空间
方法调用:压栈,分配空间;
方法结束:弹栈,释放空间。