分两种情况:第一种就是在类的内部,栈中存放的是基本类型的变量数据和对象的引用,堆中存放的是所有new出来的对象,比如int a=10,则a=10就在栈中存放的,String a=new String(),则a就在栈中存放的,new String()在堆中存放的,a相当于一个指针指向new出来的那个String的内存地址,静态域中存放的是static定义的,public static int a=0,则a=0就存放在静态域中,常量池存放的是字符串常量和基本类型常量(public static final),如public static final int a=9,则a=9就存放在常量池中;第二种是在类的内部的那些new的对象,在那些对象中,他们的成员变量是在堆中存放的,局部变量是在栈中存放的,栈内存中的局部变量随着方法的消失而消失,堆内存中的成员变量由垃圾回收器负责回收
参考文章
Java堆、栈和常量池