JAVA变量及内存分配
JAVA变量的要素包括便变量名、类型、作用域。本质上讲,变量实际上是内存中的一块区域,使用变量名来访问这块区域。每个变量使用前必须要先声明,然后赋值才可以使用。
根据变量的声明位置,可以分成
①局部变量:声明在方法体内(包含方法的参数)或语句块内部的变量。
②成员变量:声明在方法体外,类内部的变量。成员变量可以使用任何一种数据类型,包括引用类型和基本类型(见下面),在定义成员变量时可以对他进行初始化,如果不对其进行初始化,JAVA将使用默认值进行初始化,如图(1)。成员变量的作用域是该成员变量所在的整个类体。注:类外面不能有方法的声明
如: public class Person{
String name;//声明在类内部方法体外,所以是成员变量
static int age;//声明在类内部方法体外,所以是成员变量
public static void main(String[] args){
int i;//声明在方法体内,是局部变量
Person person=new Person();//person是局部变量,也是引用变量。
System.out.println("age的值是"+age);//这个是正确的,因为JAVA已经对其进行了初始化,打印结果是0
System.out.println("i的值是"+i);//这个是错误的,对于局部变量,系统不会自动初始化,必须要用户初始化(赋值)后才可以使用!
}
public void run(int m){ //m是方法的参数,是局部变量
//函数体 图(1)
}
}
根据所属数据类型分为:基本数据类型和引用类型,如图(2)。
图(2)
基本类型和引用类型的内存分配方式是不一样的。基本类型只占一块内存,引用类型实质上是指针,占两块内存。
如 int i=0;在内存里面只分配了一块内存,里面存放的就是值0,使用i这个名字来访问这块内存。
又如 String s;//此时为引用变量s分配了一块内存,但是目前这个内存什么也没有存,因为此时s不指向任何一个对象,所以是null
s=new String("hello");//使用new创建了一个对象后,又分配一块内存(堆),这个对象的内容“hello”就存放在新分配的内存中。而之前给s分配的内存也有了内容,根据这个内容就可以找到第二块内存,使用其中的内容(“hello”).
这里顺便说一下程序执行过程中内存的分配,如图(3):
图(3)
程序执行时都必须是在内存中。所以程序首先加载到内存,这时候程序代码就放在code segment这样的内存区域,然后找到main开始执行并如图所示为各种其他的变量、常量、对象等分配相应的内存。其中new出来的变量是放在堆中,局部变量是放在栈中的。例如上面代码示例中,Person person=new Person();person是一个局部变量,为它分配了栈内存,而person对象的实际内容如name和age的值是保存在堆中的,根据栈中存储的内容找到堆中person的具体内容,其内存分配情况参考下图(4)。此外,同一个类的每个对象有不同的成员变量存储空间,同一个类的每个对象共享方法,方法在执行的时候才会为其分配空间,不执行时候,就是一段代码。JAVA中进行函数调用传参时,基本类型传递的是该数值本身,引用类型传递的是对对象的引用,而不是对象本身。
图(4)