1.寄存器 最快的存储区,位于处理器内部,但是数量极其有限。所以寄存器根据需求进行分配,无法直接人为控制,在程序中也无法感觉到寄存器存在的迹象。
2.栈内存 位于RAM当中,通过堆栈指针可以从处理器获得直接支持。堆栈指针向下移动,则分配新的内存;向上移动,则释放那些内存。这种存储方式速度仅次于寄存器。 (常用于存放对象引用和基本数据类型,而不用于存储对象)
3.堆内存 一种通用的内存池,也位于RAM当中,用于存放所有的java对象。其中存放的数据由JVM自动进行管理。 堆相对于栈的好处来说:编译器不需要知道存储的数据在堆里存活多长。当需要一个对象时,使用new写一行代码,当执行这行代码时,会自动在堆里进行存储分配。同时,因为以上原因,用堆进行数据的存储分配和清理,需要花费更多的时间。
4.常量池 常量(字符串常量和基本类型常量)通常直接存储在程序代码内部(常量池)。这样做是安全的,因为它们的值在初始化时就已经被确定,并不会被改变。常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = “java”这种申明方式
5.非RAM存储区 如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是:流对象和持久化对象。
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦java看到这个null,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时就会报错。
创建基本数据类型的数据时,默认初始化为相对应的基本数据类型的默认值,例如int数组初始化所有元素值为0,boolean数组则为false。
定义了一个类之后,就可以在类中设置字段和方法,也称为成员变量和成员函数。 字段可以是任何类型的对象,可以通过其引用与其进行通信;可以是基本类型的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便其与一个实际的对象相关联。 每个对象都有用来存储其字段的空间;普通字段不能在对象间共享。 例如:
class DataOnly{ int i;//基本类型字段,此字段默认值为0,因此不进行初始化的话,JVM会给默认值。 double d; boolean b; }可以给字段赋值,通过创建该类的实例:
DataOnly data = new DataOnly(); data.i = 1; data.d = 0.01; data.b = true;而方法变量(也就是位于方法中的变量)则不会进行自动初始化,例如:
class A{ int a;//默认初始化为0 public void test(){ int b;//不会自动初始化,未对其进行赋值时,编译器将报错。 } }