首先,java程序是在JVM中跑的,而JVM是在内存中执行的,虚拟机为了更好的执行程序,会把内存划分为三个区域,栈内存,堆内存,方法区,其中方法区用来存放类文件
java">class Student{String name;double chinese;double math;public void printTotalScore(){System.out.println(name+"的总分是"+(chinese+math));}public void printAverageScore(){System.out.println(name+"的平均分是"+(chinese+math)/2);}
}
class StudentTest{public static void main(String[] args) {Student s1=new Student();s1.name="tom";s1.chinese=50;s1.math=80;s1.printAverageScore();s1.printTotalScore();}
}
对于这个代码来说,studenttest拿到方法区去执行,然后到main方法,把main方法提到栈内存中去跑,栈是后进先出,先进后出的,然后到Student s1=new Student(),首先Student s1会把student类加载到方法区,然后在栈内存的main方法中开辟一个空间给变量s1。new Student()会在堆内存中开辟一个对象,其中包括一个类的地址,指向方法区的student类,栈内存的s1中会存储一个堆内存中对象的地址
java"> s1.name="tom";s1.chinese=50;s1.math=80;
接着这三行,会利用s1指向的堆内存中的对象分别对其赋值
java"> s1.printAverageScore();s1.printTotalScore();
接着这两行会先通过s1的地址找到堆内存中的对象,再通过对象中存储的类的地址,找到方法区的student类,再调用student类中的这两个方法,然后把这两个方法拿到堆中去执行,执行完出栈继续往下执行main函数。
总结一下就是变量存栈里,栈里有对象的地址,对象存堆里,堆里有方法区的地址,方法区存方法,在栈中调用
小结: