首先说明一下java中的变量分类: java中的变量分为成员变量和局部变量。成员变量有分为实例变量(非static变量)和类变量(static变量);局部变量分为形参、方法内部的变量、代码块中的变量。 全局变量一般在接口中定义,如: public static final int SIZE = 50 用一段代码来说明一下: public class MyVariable{ public static void main(String[] args){ MyVariable mv = new MyVariable(); mv.show(); } public void show(){ int b = 20; System.out.println(b); } } b在内存中的分布(如图):mv是引用类型变量,存储在栈内存中,而对象本身(以及对象中的变量)被存放在堆内存中 这是个人理解,请指正。
局部变量——在函数体中定义
成员变量——class成员
静态变量——class静态成员没有所谓全局变量,那是C/C++的东西另外学JAVA你就不要管他存储在内存哪个地方了,那是C/C++程序员做的事情。JAVA这门落后的语言连指针都没,C#里是可以在unsafe代码块中使用指针的!如果你是新手,那么我建议放弃Java 去学C#!
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。
5、程序代码区 — 存放函数体的二进制代码。
局部变量——在函数体中定义
成员变量——class成员
静态变量——class静态成员
java程序在硬盘里存放,首先被加载到内存里,其次由操作系统找到main方法执行,再次执行过程中转化成操作系统代码。执行中的内存管理为:1.new出来的东西被分配在heap(堆区)。2.局部变量被分配在stack(栈区)。3.静态变量和字符串常量被分配在data segment(数据片段)里。4.代码被存放在code segment(代码片段)里。
因此本题变量a 是成员变量,它的值12被分配在heap区,变量名a 就是存储该整形类型数据12所在的内存块,代表的不过是个存储空间的名称;如果是静态变量的话,声明初始化为:static int a = 12;
局部变量b 的值20被分配在 stack里,变量b 就表示存储该值20的内存空间。
对于简单型常量(int, char等),编译的时候它是被编写到指令里面的,运行的时候直接从内存中载入寄存器,即所谓的寄存器寻址。
java中的变量分为成员变量和局部变量。成员变量有分为实例变量(非static变量)和类变量(static变量);局部变量分为形参、方法内部的变量、代码块中的变量。
全局变量一般在接口中定义,如:
public static final int SIZE = 50
用一段代码来说明一下:
public class MyVariable{
public static void main(String[] args){
MyVariable mv = new MyVariable();
mv.show();
}
public void show(){
int b = 20;
System.out.println(b);
}
}
b在内存中的分布(如图):mv是引用类型变量,存储在栈内存中,而对象本身(以及对象中的变量)被存放在堆内存中
这是个人理解,请指正。