局部变量
方法中的局部变量存在于栈内存。每当程序调用一个方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因。
成员变量
对象实例的引用存储在栈内存中,对象实例存储在堆内存中。所以,对象中声明的成员变量存储在堆中。(成员变量不会随着某个方法执行结束而销毁)
静态变量
类中的静态变量(被static关键字修饰)存放在 Java 内存区域的方法区。方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
我们都知道虚拟机栈来存储通过栈帧的形式来存储每一个方法,堆来存储所有对象实例和数组。
而对基本数据类型,即可能声明在方法的局部变量中,也可能声明在类的成员中,这就造成并没有明确的规定来说明基本数据类型到底是存储在堆中还是栈中。
简单来说:这取决于变量的声明位置,而不是它的类型。
局部变量存储在栈中,实例变量和静态变量存储在堆中。
也就是说,基本数据类型如果声明在方法内,那么它就存储在栈中,如果声明在类的成员或声明为static那么就存储在堆中。